mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-22 19:38:10 +02:00
This was originally needed to bind the context to the background thread for DRI2 because it needs to be able to get buffers from the X server. With DRI3 and Wayland, however, it's not needed. All the DRI3 code gets everything it needs from the drawable and only uses the context for flushes and blits, which always come from GLX itself, not the render thread. Now that we've deleted all the DRI2 code, let's delete this, too. Acked-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Eric Engestrom <eric@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36123>
970 lines
33 KiB
C
970 lines
33 KiB
C
/*
|
|
* Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
|
|
* Copyright 2007-2008 Red Hat, Inc.
|
|
* (C) Copyright IBM Corporation 2004
|
|
* All Rights Reserved.
|
|
* Copyright © 2022 Google LLC
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice (including the next
|
|
* paragraph) shall be included in all copies or substantial portions of the
|
|
* Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
* IN THE SOFTWARE.
|
|
*/
|
|
|
|
#ifndef MESA_INTERFACE_H
|
|
#define MESA_INTERFACE_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
struct dri_screen;
|
|
struct dri_context;
|
|
struct dri_drawable;
|
|
struct dri_config;
|
|
struct dri_image;
|
|
|
|
/**
|
|
* Extension struct. Drivers 'inherit' from this struct by embedding
|
|
* it as the first element in the extension struct.
|
|
*
|
|
* We never break API in for a DRI extension. If we need to change
|
|
* the way things work in a non-backwards compatible manner, we
|
|
* introduce a new extension. During a transition period, we can
|
|
* leave both the old and the new extension in the driver, which
|
|
* allows us to move to the new interface without having to update the
|
|
* loader(s) in lock step.
|
|
*
|
|
* However, we can add entry points to an extension over time as long
|
|
* as we don't break the old ones. As we add entry points to an
|
|
* extension, we increase the version number. The corresponding
|
|
* #define can be used to guard code that accesses the new entry
|
|
* points at compile time and the version field in the extension
|
|
* struct can be used at run-time to determine how to use the
|
|
* extension.
|
|
*/
|
|
typedef struct {
|
|
const char *name;
|
|
int version;
|
|
} __DRIextension;
|
|
|
|
/**
|
|
* The first set of extension are the screen extensions, returned by
|
|
* __DRIcore::getExtensions(). This entry point will return a list of
|
|
* extensions and the loader can use the ones it knows about by
|
|
* casting them to more specific extensions and advertising any GLX
|
|
* extensions the DRI extensions enables.
|
|
*/
|
|
|
|
/* Valid values for format in the setTexBuffer2 function below. These
|
|
* values match the GLX tokens for compatibility reasons, but we
|
|
* define them here since the DRI interface can't depend on GLX. */
|
|
#define __DRI_TEXTURE_FORMAT_RGB 0x20D9
|
|
#define __DRI_TEXTURE_FORMAT_RGBA 0x20DA
|
|
|
|
/**
|
|
* Used by drivers that implement DRI2. Version 3 is used by the X server.
|
|
*/
|
|
#define __DRI2_FLUSH_DRAWABLE (1 << 0) /* the drawable should be flushed. */
|
|
#define __DRI2_FLUSH_CONTEXT (1 << 1) /* glFlush should be called */
|
|
#define __DRI2_FLUSH_INVALIDATE_ANCILLARY (1 << 2)
|
|
|
|
enum __DRI2throttleReason {
|
|
__DRI2_THROTTLE_SWAPBUFFER,
|
|
__DRI2_THROTTLE_COPYSUBBUFFER,
|
|
__DRI2_THROTTLE_FLUSHFRONT,
|
|
__DRI2_NOTHROTTLE_SWAPBUFFER,
|
|
};
|
|
|
|
/**
|
|
* Extension for EGL_ANDROID_blob_cache
|
|
* *
|
|
* Not used by the X server.
|
|
*/
|
|
typedef void
|
|
(*__DRIblobCacheSet) (const void *key, signed long keySize,
|
|
const void *value, signed long valueSize);
|
|
|
|
typedef signed long
|
|
(*__DRIblobCacheGet) (const void *key, signed long keySize,
|
|
void *value, signed long valueSize);
|
|
|
|
#define __DRI2_FENCE_FLAG_FLUSH_COMMANDS (1 << 0)
|
|
|
|
/**
|
|
* \name Capabilities that might be returned by __DRI2fenceExtensionRec::get_capabilities
|
|
*/
|
|
/*@{*/
|
|
#define __DRI_FENCE_CAP_NATIVE_FD 1
|
|
/*@}*/
|
|
|
|
/*@}*/
|
|
|
|
/**
|
|
* The following extensions describe loader features that the DRI
|
|
* driver can make use of. Some of these are mandatory, such as the
|
|
* getDrawableInfo extension for DRI and the DRI Loader extensions for
|
|
* DRI2, while others are optional, and if present allow the driver to
|
|
* expose certain features. The loader pass in a NULL terminated
|
|
* array of these extensions to the driver in the createNewScreen
|
|
* constructor.
|
|
*/
|
|
|
|
#define __DRI_SWRAST_IMAGE_OP_DRAW 1
|
|
#define __DRI_SWRAST_IMAGE_OP_SWAP 3
|
|
|
|
/**
|
|
* SWRast Loader extension.
|
|
*
|
|
* Version 1 is advertised by the X server.
|
|
*/
|
|
#define __DRI_SWRAST_LOADER "DRI_SWRastLoader"
|
|
typedef struct {
|
|
__DRIextension base;
|
|
|
|
/*
|
|
* Drawable position and size
|
|
*/
|
|
void (*getDrawableInfo)(struct dri_drawable *drawable,
|
|
int *x, int *y, int *width, int *height,
|
|
void *loaderPrivate);
|
|
|
|
/**
|
|
* Put image to drawable
|
|
*/
|
|
void (*putImage)(struct dri_drawable *drawable, int op,
|
|
int x, int y, int width, int height,
|
|
char *data, void *loaderPrivate);
|
|
|
|
/**
|
|
* Get image from readable
|
|
*/
|
|
void (*getImage)(struct dri_drawable *readable,
|
|
int x, int y, int width, int height,
|
|
char *data, void *loaderPrivate);
|
|
|
|
/**
|
|
* Put image to drawable
|
|
*
|
|
* \since 2
|
|
*/
|
|
void (*putImage2)(struct dri_drawable *drawable, int op,
|
|
int x, int y, int width, int height, int stride,
|
|
char *data, void *loaderPrivate);
|
|
|
|
/**
|
|
* Put image to drawable
|
|
*
|
|
* \since 3
|
|
*/
|
|
void (*getImage2)(struct dri_drawable *readable,
|
|
int x, int y, int width, int height, int stride,
|
|
char *data, void *loaderPrivate);
|
|
|
|
/**
|
|
* Put shm image to drawable
|
|
*
|
|
* \since 4
|
|
*/
|
|
void (*putImageShm)(struct dri_drawable *drawable, int op,
|
|
int x, int y, int width, int height, int stride,
|
|
int shmid, char *shmaddr, unsigned offset,
|
|
void *loaderPrivate);
|
|
/**
|
|
* Get shm image from readable
|
|
*
|
|
* \since 4
|
|
*/
|
|
void (*getImageShm)(struct dri_drawable *readable,
|
|
int x, int y, int width, int height,
|
|
int shmid, void *loaderPrivate);
|
|
|
|
/**
|
|
* Put shm image to drawable (v2)
|
|
*
|
|
* The original version fixes srcx/y to 0, and expected
|
|
* the offset to be adjusted. This version allows src x,y
|
|
* to not be included in the offset. This is needed to
|
|
* avoid certain overflow checks in the X server, that
|
|
* result in lost rendering.
|
|
*
|
|
* \since 5
|
|
*/
|
|
void (*putImageShm2)(struct dri_drawable *drawable, int op,
|
|
int x, int y,
|
|
int width, int height, int stride,
|
|
int shmid, char *shmaddr, unsigned offset,
|
|
void *loaderPrivate);
|
|
|
|
/**
|
|
* get shm image to drawable (v2)
|
|
*
|
|
* There are some cases where GLX can't use SHM, but DRI
|
|
* still tries, we need to get a return type for when to
|
|
* fallback to the non-shm path.
|
|
*
|
|
* \since 6
|
|
*/
|
|
unsigned char (*getImageShm2)(struct dri_drawable *readable,
|
|
int x, int y, int width, int height,
|
|
int shmid, void *loaderPrivate);
|
|
} __DRIswrastLoaderExtension;
|
|
|
|
/**
|
|
* Tokens for struct dri_config attribs. A number of attributes defined by
|
|
* GLX or EGL standards are not in the table, as they must be provided
|
|
* by the loader. For example, FBConfig ID or visual ID, drawable type.
|
|
*/
|
|
|
|
#define __DRI_ATTRIB_BUFFER_SIZE 1
|
|
#define __DRI_ATTRIB_LEVEL 2
|
|
#define __DRI_ATTRIB_RED_SIZE 3
|
|
#define __DRI_ATTRIB_GREEN_SIZE 4
|
|
#define __DRI_ATTRIB_BLUE_SIZE 5
|
|
#define __DRI_ATTRIB_LUMINANCE_SIZE 6
|
|
#define __DRI_ATTRIB_ALPHA_SIZE 7
|
|
#define __DRI_ATTRIB_ALPHA_MASK_SIZE 8
|
|
#define __DRI_ATTRIB_DEPTH_SIZE 9
|
|
#define __DRI_ATTRIB_STENCIL_SIZE 10
|
|
#define __DRI_ATTRIB_ACCUM_RED_SIZE 11
|
|
#define __DRI_ATTRIB_ACCUM_GREEN_SIZE 12
|
|
#define __DRI_ATTRIB_ACCUM_BLUE_SIZE 13
|
|
#define __DRI_ATTRIB_ACCUM_ALPHA_SIZE 14
|
|
#define __DRI_ATTRIB_SAMPLE_BUFFERS 15
|
|
#define __DRI_ATTRIB_SAMPLES 16
|
|
#define __DRI_ATTRIB_RENDER_TYPE 17
|
|
#define __DRI_ATTRIB_CONFIG_CAVEAT 18
|
|
#define __DRI_ATTRIB_CONFORMANT 19
|
|
#define __DRI_ATTRIB_DOUBLE_BUFFER 20
|
|
#define __DRI_ATTRIB_STEREO 21
|
|
#define __DRI_ATTRIB_AUX_BUFFERS 22
|
|
#define __DRI_ATTRIB_TRANSPARENT_TYPE 23
|
|
#define __DRI_ATTRIB_TRANSPARENT_INDEX_VALUE 24
|
|
#define __DRI_ATTRIB_TRANSPARENT_RED_VALUE 25
|
|
#define __DRI_ATTRIB_TRANSPARENT_GREEN_VALUE 26
|
|
#define __DRI_ATTRIB_TRANSPARENT_BLUE_VALUE 27
|
|
#define __DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE 28
|
|
#define __DRI_ATTRIB_FLOAT_MODE 29
|
|
#define __DRI_ATTRIB_RED_MASK 30
|
|
#define __DRI_ATTRIB_GREEN_MASK 31
|
|
#define __DRI_ATTRIB_BLUE_MASK 32
|
|
#define __DRI_ATTRIB_ALPHA_MASK 33
|
|
#define __DRI_ATTRIB_MAX_PBUFFER_WIDTH 34
|
|
#define __DRI_ATTRIB_MAX_PBUFFER_HEIGHT 35
|
|
#define __DRI_ATTRIB_MAX_PBUFFER_PIXELS 36
|
|
#define __DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH 37
|
|
#define __DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT 38
|
|
#define __DRI_ATTRIB_VISUAL_SELECT_GROUP 39
|
|
#define __DRI_ATTRIB_SWAP_METHOD 40 // Parsed by the X server when our visuals return it as an attrib.
|
|
#define __DRI_ATTRIB_MAX_SWAP_INTERVAL 41
|
|
#define __DRI_ATTRIB_MIN_SWAP_INTERVAL 42
|
|
#define __DRI_ATTRIB_BIND_TO_TEXTURE_RGB 43
|
|
#define __DRI_ATTRIB_BIND_TO_TEXTURE_RGBA 44
|
|
#define __DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE 45
|
|
#define __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS 46
|
|
#define __DRI_ATTRIB_YINVERTED 47
|
|
#define __DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE 48
|
|
#define __DRI_ATTRIB_MUTABLE_RENDER_BUFFER 49 /* EGL_MUTABLE_RENDER_BUFFER_BIT_KHR */
|
|
#define __DRI_ATTRIB_RED_SHIFT 50
|
|
#define __DRI_ATTRIB_GREEN_SHIFT 51
|
|
#define __DRI_ATTRIB_BLUE_SHIFT 52
|
|
#define __DRI_ATTRIB_ALPHA_SHIFT 53
|
|
#define __DRI_ATTRIB_MAX 54
|
|
|
|
/* __DRI_ATTRIB_RENDER_TYPE */
|
|
#define __DRI_ATTRIB_RGBA_BIT 0x01
|
|
#define __DRI_ATTRIB_COLOR_INDEX_BIT 0x02
|
|
#define __DRI_ATTRIB_LUMINANCE_BIT 0x04
|
|
#define __DRI_ATTRIB_FLOAT_BIT 0x08
|
|
#define __DRI_ATTRIB_UNSIGNED_FLOAT_BIT 0x10
|
|
|
|
/* __DRI_ATTRIB_CONFIG_CAVEAT */
|
|
#define __DRI_ATTRIB_SLOW_BIT 0x01
|
|
#define __DRI_ATTRIB_NON_CONFORMANT_CONFIG 0x02
|
|
|
|
/* __DRI_ATTRIB_TRANSPARENT_TYPE */
|
|
#define __DRI_ATTRIB_TRANSPARENT_RGB 0x00
|
|
#define __DRI_ATTRIB_TRANSPARENT_INDEX 0x01
|
|
|
|
/* __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS */
|
|
#define __DRI_ATTRIB_TEXTURE_1D_BIT 0x01
|
|
#define __DRI_ATTRIB_TEXTURE_2D_BIT 0x02
|
|
#define __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT 0x04
|
|
|
|
/* __DRI_ATTRIB_SWAP_METHOD */
|
|
/* Note that with the exception of __DRI_ATTRIB_SWAP_NONE, we need to define
|
|
* the same tokens as GLX. This is because old and current X servers will
|
|
* transmit the driconf value grabbed from the AIGLX driver untranslated as
|
|
* the GLX fbconfig value. These defines are kept for X Server suorce compatibility,
|
|
* since Mesa no longer exposes GLX_OML_swap_method.
|
|
*/
|
|
#define __DRI_ATTRIB_SWAP_UNDEFINED 0x8063
|
|
|
|
/**
|
|
* This extension defines the core DRI functionality. It was introduced when
|
|
* DRI2 and AIGLX were added.
|
|
*
|
|
* Version >= 2 indicates that getConfigAttrib with __DRI_ATTRIB_SWAP_METHOD
|
|
* returns a reliable value. The X server requires v1 and uses v2.
|
|
*/
|
|
typedef struct {
|
|
__DRIextension base;
|
|
|
|
/* Not used by the X server. */
|
|
struct dri_screen *(*createNewScreen)(int screen, int fd,
|
|
unsigned int sarea_handle,
|
|
const __DRIextension **extensions,
|
|
const struct dri_config ***driverConfigs,
|
|
void *loaderPrivate);
|
|
|
|
void (*destroyScreen)(struct dri_screen *screen);
|
|
|
|
const __DRIextension **(*getExtensions)(struct dri_screen *screen);
|
|
|
|
/* Not used by the X server. */
|
|
int (*getConfigAttrib)(const struct dri_config *config,
|
|
unsigned int attrib,
|
|
unsigned int *value);
|
|
|
|
/* Not used by the X server. */
|
|
int (*indexConfigAttrib)(const struct dri_config *config, int index,
|
|
unsigned int *attrib, unsigned int *value);
|
|
|
|
/* Not used by the X server. */
|
|
struct dri_drawable *(*createNewDrawable)(struct dri_screen *screen,
|
|
const struct dri_config *config,
|
|
unsigned int drawable_id,
|
|
unsigned int head,
|
|
void *loaderPrivate);
|
|
|
|
/* Used by the X server */
|
|
void (*destroyDrawable)(struct dri_drawable *drawable);
|
|
|
|
/* Used by the X server in swrast mode. */
|
|
void (*swapBuffers)(struct dri_drawable *drawable);
|
|
|
|
/* Used by the X server in swrast mode. */
|
|
struct dri_context *(*createNewContext)(struct dri_screen *screen,
|
|
const struct dri_config *config,
|
|
struct dri_context *shared,
|
|
void *loaderPrivate);
|
|
|
|
/* Used by the X server. */
|
|
int (*copyContext)(struct dri_context *dest,
|
|
struct dri_context *src,
|
|
unsigned long mask);
|
|
|
|
/* Used by the X server. */
|
|
void (*destroyContext)(struct dri_context *context);
|
|
|
|
/* Used by the X server. */
|
|
int (*bindContext)(struct dri_context *ctx,
|
|
struct dri_drawable *pdraw,
|
|
struct dri_drawable *pread);
|
|
|
|
/* Used by the X server. */
|
|
int (*unbindContext)(struct dri_context *ctx);
|
|
|
|
void (*swapBuffersWithDamage)(struct dri_drawable *drawable, int nrects, const int *rects);
|
|
} __DRIcoreExtension;
|
|
|
|
/** Common DRI function definitions, shared among DRI2 and Image extensions
|
|
*/
|
|
|
|
typedef struct dri_screen *
|
|
(*__DRIcreateNewScreen2Func)(int screen, int fd,
|
|
const __DRIextension **extensions,
|
|
const __DRIextension **driver_extensions,
|
|
const struct dri_config ***driver_configs,
|
|
void *loaderPrivate);
|
|
typedef struct dri_screen *
|
|
(*__DRIcreateNewScreen3Func)(int screen, int fd,
|
|
const __DRIextension **extensions,
|
|
const __DRIextension **driver_extensions,
|
|
const struct dri_config ***driver_configs,
|
|
bool implicit,
|
|
void *loaderPrivate);
|
|
|
|
typedef struct dri_drawable *
|
|
(*__DRIcreateNewDrawableFunc)(struct dri_screen *screen,
|
|
const struct dri_config *config,
|
|
void *loaderPrivate);
|
|
|
|
typedef struct dri_context *
|
|
(*__DRIcreateContextAttribsFunc)(struct dri_screen *screen,
|
|
int api,
|
|
const struct dri_config *config,
|
|
struct dri_context *shared,
|
|
unsigned num_attribs,
|
|
const uint32_t *attribs,
|
|
unsigned *error,
|
|
void *loaderPrivate);
|
|
|
|
typedef unsigned int
|
|
(*__DRIgetAPIMaskFunc)(struct dri_screen *screen);
|
|
|
|
/**
|
|
* DRI2 Loader extension.
|
|
*
|
|
* These definitions are shared with xcb/dri2.h.
|
|
* Changing these definitions would break DRI2.
|
|
*/
|
|
#define __DRI_BUFFER_FRONT_LEFT 0
|
|
#define __DRI_BUFFER_BACK_LEFT 1
|
|
#define __DRI_BUFFER_FRONT_RIGHT 2
|
|
#define __DRI_BUFFER_BACK_RIGHT 3
|
|
#define __DRI_BUFFER_DEPTH 4
|
|
#define __DRI_BUFFER_STENCIL 5
|
|
#define __DRI_BUFFER_ACCUM 6
|
|
#define __DRI_BUFFER_FAKE_FRONT_LEFT 7
|
|
#define __DRI_BUFFER_FAKE_FRONT_RIGHT 8
|
|
#define __DRI_BUFFER_DEPTH_STENCIL 9 /**< Only available with DRI2 1.1 */
|
|
#define __DRI_BUFFER_HIZ 10
|
|
|
|
/* Inofficial and for internal use. Increase when adding a new buffer token. */
|
|
#define __DRI_BUFFER_COUNT 11
|
|
|
|
/* Used by the X server. */
|
|
typedef struct {
|
|
unsigned int attachment;
|
|
unsigned int name;
|
|
unsigned int pitch;
|
|
unsigned int cpp;
|
|
unsigned int flags;
|
|
} __DRIbuffer;
|
|
|
|
enum dri_loader_cap {
|
|
/* Whether the loader handles RGBA channel ordering correctly. If not,
|
|
* only BGRA ordering can be exposed.
|
|
*/
|
|
DRI_LOADER_CAP_RGBA_ORDERING,
|
|
DRI_LOADER_CAP_FP16,
|
|
};
|
|
|
|
/**
|
|
* This extension provides alternative screen, drawable and context
|
|
* constructors for DRI2. The X server uses up to version 4.
|
|
*/
|
|
#define __DRI_API_OPENGL 0 /**< OpenGL compatibility profile */
|
|
#define __DRI_API_GLES 1 /**< OpenGL ES 1.x */
|
|
#define __DRI_API_GLES2 2 /**< OpenGL ES 2.x */
|
|
#define __DRI_API_OPENGL_CORE 3 /**< OpenGL 3.2+ core profile */
|
|
#define __DRI_API_GLES3 4 /**< OpenGL ES 3.x */
|
|
|
|
#define __DRI_CTX_ATTRIB_MAJOR_VERSION 0
|
|
#define __DRI_CTX_ATTRIB_MINOR_VERSION 1
|
|
|
|
/* These must alias the GLX/EGL values. */
|
|
#define __DRI_CTX_ATTRIB_FLAGS 2
|
|
#define __DRI_CTX_FLAG_DEBUG 0x00000001
|
|
#define __DRI_CTX_FLAG_FORWARD_COMPATIBLE 0x00000002
|
|
#define __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS 0x00000004
|
|
/* Not yet implemented but placed here to reserve the alias with GLX */
|
|
#define __DRI_CTX_FLAG_RESET_ISOLATION 0x00000008
|
|
|
|
#define __DRI_CTX_ATTRIB_RESET_STRATEGY 3
|
|
#define __DRI_CTX_RESET_NO_NOTIFICATION 0
|
|
#define __DRI_CTX_RESET_LOSE_CONTEXT 1
|
|
|
|
/**
|
|
* \name Context priority levels.
|
|
*/
|
|
#define __DRI_CTX_ATTRIB_PRIORITY 4
|
|
#define __DRI_CTX_PRIORITY_LOW 0
|
|
#define __DRI_CTX_PRIORITY_MEDIUM 1
|
|
#define __DRI_CTX_PRIORITY_HIGH 2
|
|
#define __DRI_CTX_PRIORITY_REALTIME 3
|
|
|
|
#define __DRI_CTX_ATTRIB_RELEASE_BEHAVIOR 5
|
|
#define __DRI_CTX_RELEASE_BEHAVIOR_NONE 0
|
|
#define __DRI_CTX_RELEASE_BEHAVIOR_FLUSH 1
|
|
|
|
#define __DRI_CTX_ATTRIB_NO_ERROR 6
|
|
|
|
/**
|
|
* \requires __DRI2_RENDER_HAS_PROTECTED_CONTEXT.
|
|
*
|
|
*/
|
|
#define __DRI_CTX_ATTRIB_PROTECTED 7
|
|
|
|
|
|
#define __DRI_CTX_NUM_ATTRIBS 8
|
|
|
|
/**
|
|
* \name Reasons that createContextAttribs might fail
|
|
*/
|
|
/*@{*/
|
|
/** Success! */
|
|
#define __DRI_CTX_ERROR_SUCCESS 0
|
|
|
|
/** Memory allocation failure */
|
|
#define __DRI_CTX_ERROR_NO_MEMORY 1
|
|
|
|
/** Client requested an API (e.g., OpenGL ES 2.0) that the driver can't do. */
|
|
#define __DRI_CTX_ERROR_BAD_API 2
|
|
|
|
/** Client requested an API version that the driver can't do. */
|
|
#define __DRI_CTX_ERROR_BAD_VERSION 3
|
|
|
|
/** Client requested a flag or combination of flags the driver can't do. */
|
|
#define __DRI_CTX_ERROR_BAD_FLAG 4
|
|
|
|
/** Client requested an attribute the driver doesn't understand. */
|
|
#define __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE 5
|
|
|
|
/** Client requested a flag the driver doesn't understand. */
|
|
#define __DRI_CTX_ERROR_UNKNOWN_FLAG 6
|
|
/*@}*/
|
|
|
|
|
|
/**
|
|
* This extension provides functionality to enable various EGLImage
|
|
* extensions.
|
|
*/
|
|
/* __DRI_IMAGE_FORMAT_* tokens are no longer exported */
|
|
|
|
#define __DRI_IMAGE_USE_SHARE 0x0001
|
|
#define __DRI_IMAGE_USE_SCANOUT 0x0002
|
|
#define __DRI_IMAGE_USE_CURSOR 0x0004 /* Deprecated */
|
|
#define __DRI_IMAGE_USE_LINEAR 0x0008
|
|
/* The buffer will only be read by an external process after SwapBuffers,
|
|
* in contrary to gbm buffers, front buffers and fake front buffers, which
|
|
* could be read after a flush."
|
|
*/
|
|
#define __DRI_IMAGE_USE_BACKBUFFER 0x0010
|
|
#define __DRI_IMAGE_USE_PROTECTED 0x0020
|
|
#define __DRI_IMAGE_USE_PRIME_BUFFER 0x0040
|
|
#define __DRI_IMAGE_USE_FRONT_RENDERING 0x0080
|
|
|
|
|
|
#define __DRI_IMAGE_TRANSFER_READ 0x1
|
|
#define __DRI_IMAGE_TRANSFER_WRITE 0x2
|
|
#define __DRI_IMAGE_TRANSFER_READ_WRITE \
|
|
(__DRI_IMAGE_TRANSFER_READ | __DRI_IMAGE_TRANSFER_WRITE)
|
|
|
|
/**
|
|
* Extra fourcc formats used internally to Mesa with createImageFromNames.
|
|
* The externally-available fourccs are defined by drm_fourcc.h (DRM_FORMAT_*)
|
|
* and WL_DRM_FORMAT_* from wayland_drm.h.
|
|
*
|
|
* \since 5
|
|
*/
|
|
|
|
#define __DRI_IMAGE_FOURCC_SARGB8888 0x83324258
|
|
#define __DRI_IMAGE_FOURCC_SABGR8888 0x84324258
|
|
#define __DRI_IMAGE_FOURCC_SXRGB8888 0x85324258
|
|
|
|
|
|
/**
|
|
* queryImage attributes
|
|
*/
|
|
|
|
#define __DRI_IMAGE_ATTRIB_STRIDE 0x2000
|
|
#define __DRI_IMAGE_ATTRIB_HANDLE 0x2001
|
|
#define __DRI_IMAGE_ATTRIB_NAME 0x2002
|
|
#define __DRI_IMAGE_ATTRIB_FORMAT 0x2003 /* available in versions 3+ */
|
|
#define __DRI_IMAGE_ATTRIB_WIDTH 0x2004 /* available in versions 4+ */
|
|
#define __DRI_IMAGE_ATTRIB_HEIGHT 0x2005
|
|
#define __DRI_IMAGE_ATTRIB_FD 0x2007 /* available in versions
|
|
* 7+. Each query will return a
|
|
* new fd. */
|
|
#define __DRI_IMAGE_ATTRIB_FOURCC 0x2008 /* available in versions 11 */
|
|
#define __DRI_IMAGE_ATTRIB_NUM_PLANES 0x2009 /* available in versions 11 */
|
|
|
|
#define __DRI_IMAGE_ATTRIB_OFFSET 0x200A /* available in versions 13 */
|
|
#define __DRI_IMAGE_ATTRIB_MODIFIER_LOWER 0x200B /* available in versions 14 */
|
|
#define __DRI_IMAGE_ATTRIB_MODIFIER_UPPER 0x200C /* available in versions 14 */
|
|
#define __DRI_IMAGE_ATTRIB_COMPRESSION_RATE 0x200D /* available in versions 22 */
|
|
|
|
enum __DRIYUVColorSpace {
|
|
__DRI_YUV_COLOR_SPACE_UNDEFINED = 0,
|
|
__DRI_YUV_COLOR_SPACE_ITU_REC601 = 0x327F,
|
|
__DRI_YUV_COLOR_SPACE_ITU_REC709 = 0x3280,
|
|
__DRI_YUV_COLOR_SPACE_ITU_REC2020 = 0x3281
|
|
};
|
|
|
|
enum __DRISampleRange {
|
|
__DRI_YUV_RANGE_UNDEFINED = 0,
|
|
__DRI_YUV_FULL_RANGE = 0x3282,
|
|
__DRI_YUV_NARROW_RANGE = 0x3283
|
|
};
|
|
|
|
enum __DRIChromaSiting {
|
|
__DRI_YUV_CHROMA_SITING_UNDEFINED = 0,
|
|
__DRI_YUV_CHROMA_SITING_0 = 0x3284,
|
|
__DRI_YUV_CHROMA_SITING_0_5 = 0x3285
|
|
};
|
|
|
|
enum __DRIFixedRateCompression {
|
|
__DRI_FIXED_RATE_COMPRESSION_NONE = 0x34B1,
|
|
__DRI_FIXED_RATE_COMPRESSION_DEFAULT = 0x34B2,
|
|
|
|
__DRI_FIXED_RATE_COMPRESSION_1BPC = 0x34B4,
|
|
__DRI_FIXED_RATE_COMPRESSION_2BPC = 0x34B5,
|
|
__DRI_FIXED_RATE_COMPRESSION_3BPC = 0x34B6,
|
|
__DRI_FIXED_RATE_COMPRESSION_4BPC = 0x34B7,
|
|
__DRI_FIXED_RATE_COMPRESSION_5BPC = 0x34B8,
|
|
__DRI_FIXED_RATE_COMPRESSION_6BPC = 0x34B9,
|
|
__DRI_FIXED_RATE_COMPRESSION_7BPC = 0x34BA,
|
|
__DRI_FIXED_RATE_COMPRESSION_8BPC = 0x34BB,
|
|
__DRI_FIXED_RATE_COMPRESSION_9BPC = 0x34BC,
|
|
__DRI_FIXED_RATE_COMPRESSION_10BPC = 0x34BD,
|
|
__DRI_FIXED_RATE_COMPRESSION_11BPC = 0x34BE,
|
|
__DRI_FIXED_RATE_COMPRESSION_12BPC = 0x34BF,
|
|
};
|
|
|
|
/**
|
|
* \name Reasons that __DRIimageExtensionRec::createImageFromTexture or
|
|
* __DRIimageExtensionRec::createImageFromDmaBufs might fail
|
|
*/
|
|
/*@{*/
|
|
/** Success! */
|
|
#define __DRI_IMAGE_ERROR_SUCCESS 0
|
|
|
|
/** Memory allocation failure */
|
|
#define __DRI_IMAGE_ERROR_BAD_ALLOC 1
|
|
|
|
/** Client requested an invalid attribute */
|
|
#define __DRI_IMAGE_ERROR_BAD_MATCH 2
|
|
|
|
/** Client requested an invalid texture object */
|
|
#define __DRI_IMAGE_ERROR_BAD_PARAMETER 3
|
|
|
|
/** Client requested an invalid pitch and/or offset */
|
|
#define __DRI_IMAGE_ERROR_BAD_ACCESS 4
|
|
/*@}*/
|
|
|
|
/**
|
|
* \name Capabilities that might be returned by __DRIimageExtensionRec::getCapabilities
|
|
*/
|
|
/*@{*/
|
|
#define __DRI_IMAGE_CAP_GLOBAL_NAMES 1
|
|
/*@}*/
|
|
|
|
/**
|
|
* blitImage flags
|
|
*/
|
|
|
|
#define __BLIT_FLAG_FLUSH 0x0001
|
|
#define __BLIT_FLAG_FINISH 0x0002
|
|
|
|
/**
|
|
* Flags for createImageFromDmaBufs
|
|
*/
|
|
#define __DRI_IMAGE_PROTECTED_CONTENT_FLAG 0x00000001
|
|
#define __DRI_IMAGE_PRIME_LINEAR_BUFFER 0x00000002
|
|
|
|
/**
|
|
* queryDmaBufFormatModifierAttribs attributes
|
|
*/
|
|
|
|
/* Available in version 16 */
|
|
#define __DRI_IMAGE_FORMAT_MODIFIER_ATTRIB_PLANE_COUNT 0x0001
|
|
|
|
/**
|
|
* This extension must be implemented by the loader and passed to the
|
|
* driver at screen creation time. The EGLImage entry points in the
|
|
* various client APIs take opaque EGLImage handles and use this
|
|
* extension to map them to a struct dri_image. At version 1, this
|
|
* extensions allows mapping EGLImage pointers to struct dri_image pointers,
|
|
* but future versions could support other EGLImage-like, opaque types
|
|
* with new lookup functions.
|
|
*/
|
|
#define __DRI_IMAGE_LOOKUP "DRI_IMAGE_LOOKUP"
|
|
|
|
typedef struct {
|
|
__DRIextension base;
|
|
|
|
/**
|
|
* Check if EGLImage is associated with the EGL display before lookup with
|
|
* lookupEGLImageValidated(). It will hold EGLDisplay.Mutex, so is separated
|
|
* out from lookupEGLImageValidated() to avoid deadlock.
|
|
*/
|
|
unsigned char (*validateEGLImage)(void *image, void *loaderPrivate);
|
|
|
|
/**
|
|
* Lookup EGLImage after validateEGLImage(). No lock in this function.
|
|
*/
|
|
struct dri_image *(*lookupEGLImageValidated)(void *image, void *loaderPrivate);
|
|
} __DRIimageLookupExtension;
|
|
|
|
/**
|
|
* This extension allows for common DRI2 options
|
|
*/
|
|
#define __DRI2_CONFIG_QUERY "DRI_CONFIG_QUERY"
|
|
|
|
typedef struct {
|
|
__DRIextension base;
|
|
|
|
int (*configQueryb)(struct dri_screen *screen, const char *var, unsigned char *val);
|
|
int (*configQueryi)(struct dri_screen *screen, const char *var, int *val);
|
|
int (*configQueryf)(struct dri_screen *screen, const char *var, float *val);
|
|
int (*configQuerys)(struct dri_screen *screen, const char *var, char **val);
|
|
} __DRI2configQueryExtension;
|
|
|
|
/**
|
|
* DRI config options extension.
|
|
*
|
|
* This extension provides the XML string containing driver options for use by
|
|
* the loader in supporting the driconf application.
|
|
*
|
|
* v2:
|
|
* - Add the getXml getter function which allows the driver more flexibility in
|
|
* how the XML is provided.
|
|
* - Deprecate the direct xml pointer. It is only provided as a fallback for
|
|
* older versions of libGL and must not be used by clients that are aware of
|
|
* the newer version. Future driver versions may set it to NULL.
|
|
*/
|
|
#define __DRI_CONFIG_OPTIONS "DRI_ConfigOptions"
|
|
|
|
typedef struct {
|
|
__DRIextension base;
|
|
const char *xml; /**< deprecated since v2, use getXml instead */
|
|
|
|
/**
|
|
* Get an XML string that describes available driver options for use by a
|
|
* config application.
|
|
*
|
|
* The returned string must be heap-allocated. The caller is responsible for
|
|
* freeing it.
|
|
*/
|
|
char *(*getXml)(const char *driver_name);
|
|
} __DRIconfigOptionsExtension;
|
|
|
|
/**
|
|
* Query renderer driver extension
|
|
*
|
|
* This allows the window system layer (either EGL or GLX) to query aspects of
|
|
* hardware and driver support without creating a context.
|
|
*/
|
|
#define __DRI2_RENDERER_VENDOR_ID 0x0000
|
|
#define __DRI2_RENDERER_DEVICE_ID 0x0001
|
|
#define __DRI2_RENDERER_VERSION 0x0002
|
|
#define __DRI2_RENDERER_ACCELERATED 0x0003
|
|
#define __DRI2_RENDERER_VIDEO_MEMORY 0x0004
|
|
#define __DRI2_RENDERER_UNIFIED_MEMORY_ARCHITECTURE 0x0005
|
|
#define __DRI2_RENDERER_PREFERRED_PROFILE 0x0006
|
|
#define __DRI2_RENDERER_OPENGL_CORE_PROFILE_VERSION 0x0007
|
|
#define __DRI2_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION 0x0008
|
|
#define __DRI2_RENDERER_OPENGL_ES_PROFILE_VERSION 0x0009
|
|
#define __DRI2_RENDERER_OPENGL_ES2_PROFILE_VERSION 0x000a
|
|
|
|
#define __DRI2_RENDERER_PREFER_BACK_BUFFER_REUSE 0x000f
|
|
|
|
/**
|
|
* Image Loader extension. Drivers use this to allocate color buffers
|
|
*/
|
|
|
|
/**
|
|
* See __DRIimageLoaderExtensionRec::getBuffers::buffer_mask.
|
|
*/
|
|
enum __DRIimageBufferMask {
|
|
__DRI_IMAGE_BUFFER_BACK = (1 << 0),
|
|
__DRI_IMAGE_BUFFER_FRONT = (1 << 1),
|
|
|
|
/**
|
|
* A buffer shared between application and compositor. The buffer may be
|
|
* simultaneously accessed by each.
|
|
*
|
|
* A shared buffer is equivalent to an EGLSurface whose EGLConfig contains
|
|
* EGL_MUTABLE_RENDER_BUFFER_BIT_KHR and whose active EGL_RENDER_BUFFER (as
|
|
* opposed to any pending, requested change to EGL_RENDER_BUFFER) is
|
|
* EGL_SINGLE_BUFFER.
|
|
*
|
|
* If buffer_mask contains __DRI_IMAGE_BUFFER_SHARED, then must contains no
|
|
* other bits. As a corollary, a struct dri_drawable that has a "shared" buffer
|
|
* has no front nor back buffer.
|
|
*
|
|
* The loader returns __DRI_IMAGE_BUFFER_SHARED in buffer_mask if and only
|
|
* if:
|
|
* - The loader supports __DRI_MUTABLE_RENDER_BUFFER_LOADER.
|
|
* - The driver supports __DRI_MUTABLE_RENDER_BUFFER_DRIVER.
|
|
* - The EGLConfig of the drawable EGLSurface contains
|
|
* EGL_MUTABLE_RENDER_BUFFER_BIT_KHR.
|
|
* - The EGLContext's EGL_RENDER_BUFFER is EGL_SINGLE_BUFFER.
|
|
* Equivalently, the EGLSurface's active EGL_RENDER_BUFFER (as
|
|
* opposed to any pending, requested change to EGL_RENDER_BUFFER) is
|
|
* EGL_SINGLE_BUFFER. (See the EGL 1.5 and
|
|
* EGL_KHR_mutable_render_buffer spec for details about "pending" vs
|
|
* "active" EGL_RENDER_BUFFER state).
|
|
*
|
|
* A shared buffer is similar to a front buffer in that all rendering to the
|
|
* buffer should appear promptly on the screen. It is different from
|
|
* a front buffer in that its behavior is independent from the
|
|
* GL_DRAW_BUFFER state. Specifically, if GL_DRAW_FRAMEBUFFER is 0 and the
|
|
* struct dri_drawable's buffer_mask is __DRI_IMAGE_BUFFER_SHARED, then all
|
|
* rendering should appear promptly on the screen if GL_DRAW_BUFFER is not
|
|
* GL_NONE.
|
|
*
|
|
* The difference between a shared buffer and a front buffer is motivated
|
|
* by the constraints of Android and OpenGL ES. OpenGL ES does not support
|
|
* front-buffer rendering. Android's SurfaceFlinger protocol provides the
|
|
* EGL driver only a back buffer and no front buffer. The shared buffer
|
|
* mode introduced by EGL_KHR_mutable_render_buffer is a backdoor though
|
|
* EGL that allows Android OpenGL ES applications to render to what is
|
|
* effectively the front buffer, a backdoor that required no change to the
|
|
* OpenGL ES API and little change to the SurfaceFlinger API.
|
|
*/
|
|
__DRI_IMAGE_BUFFER_SHARED = (1 << 2),
|
|
};
|
|
|
|
struct __DRIimageList {
|
|
uint32_t image_mask;
|
|
struct dri_image *back;
|
|
struct dri_image *front;
|
|
};
|
|
|
|
#define __DRI_IMAGE_LOADER "DRI_IMAGE_LOADER"
|
|
|
|
typedef struct {
|
|
__DRIextension base;
|
|
|
|
/**
|
|
* Allocate color buffers.
|
|
*
|
|
* \param driDrawable
|
|
* \param width Width of allocated buffers
|
|
* \param height Height of allocated buffers
|
|
* \param format one of __DRI_IMAGE_FORMAT_*
|
|
* \param stamp Address of variable to be updated when
|
|
* getBuffers must be called again
|
|
* \param loaderPrivate The loaderPrivate for driDrawable
|
|
* \param buffer_mask Set of buffers to allocate. A bitmask of
|
|
* __DRIimageBufferMask.
|
|
* \param buffers Returned buffers
|
|
*/
|
|
int (*getBuffers)(struct dri_drawable *driDrawable,
|
|
unsigned int format,
|
|
uint32_t *stamp,
|
|
void *loaderPrivate,
|
|
uint32_t buffer_mask,
|
|
struct __DRIimageList *buffers);
|
|
|
|
/**
|
|
* Flush pending front-buffer rendering
|
|
*
|
|
* Any rendering that has been performed to the
|
|
* fake front will be flushed to the front
|
|
*
|
|
* \param driDrawable Drawable whose front-buffer is to be flushed
|
|
* \param loaderPrivate Loader's private data
|
|
*/
|
|
void (*flushFrontBuffer)(struct dri_drawable *driDrawable, void *loaderPrivate);
|
|
|
|
/**
|
|
* Return a loader capability value. If the loader doesn't know the enum,
|
|
* it will return 0.
|
|
*
|
|
* \since 2
|
|
*/
|
|
unsigned (*getCapability)(void *loaderPrivate, enum dri_loader_cap cap);
|
|
|
|
/**
|
|
* Flush swap buffers
|
|
*
|
|
* Make sure any outstanding swap buffers have been submitted to the
|
|
* device.
|
|
*
|
|
* \param driDrawable Drawable whose swaps need to be flushed
|
|
* \param loaderPrivate Loader's private data
|
|
*
|
|
* \since 3
|
|
*/
|
|
void (*flushSwapBuffers)(struct dri_drawable *driDrawable, void *loaderPrivate);
|
|
|
|
/**
|
|
* Clean up any loader state associated with an image.
|
|
*
|
|
* \param loaderPrivate Loader's private data that was previously passed
|
|
* into a __DRIimageExtensionRec::createImage function
|
|
* \since 4
|
|
*/
|
|
void (*destroyLoaderImageState)(void *loaderPrivate);
|
|
} __DRIimageLoaderExtension;
|
|
|
|
/**
|
|
* The loader portion of EGL_KHR_mutable_render_buffer.
|
|
*
|
|
* Requires loader extension DRI_IMAGE_LOADER, through which the loader sends
|
|
* __DRI_IMAGE_BUFFER_SHARED to the driver.
|
|
*
|
|
* Not used by the X server.
|
|
*
|
|
* \see __DRI_MUTABLE_RENDER_BUFFER_DRIVER
|
|
*/
|
|
#define __DRI_MUTABLE_RENDER_BUFFER_LOADER "DRI_MutableRenderBufferLoader"
|
|
|
|
typedef struct {
|
|
__DRIextension base;
|
|
|
|
/**
|
|
* Inform the display engine (that is, SurfaceFlinger and/or hwcomposer)
|
|
* that the struct dri_drawable has new content.
|
|
*
|
|
* The display engine may ignore this call, for example, if it continually
|
|
* refreshes and displays the buffer on every frame, as in
|
|
* EGL_ANDROID_front_buffer_auto_refresh. On the other extreme, the display
|
|
* engine may refresh and display the buffer only in frames in which the
|
|
* driver calls this.
|
|
*
|
|
* If the fence_fd is not -1, then the display engine will display the
|
|
* buffer only after the fence signals.
|
|
*
|
|
* The drawable's current __DRIimageBufferMask, as returned by
|
|
* __DRIimageLoaderExtension::getBuffers(), must be
|
|
* __DRI_IMAGE_BUFFER_SHARED.
|
|
*/
|
|
void (*displaySharedBuffer)(struct dri_drawable *drawable, int fence_fd,
|
|
void *loaderPrivate);
|
|
} __DRImutableRenderBufferLoaderExtension;
|
|
|
|
/* Mesa-internal interface between the GLX, GBM, and EGL DRI driver loaders, and
|
|
* the gallium dri_util.c code.
|
|
*/
|
|
|
|
#define __DRI_MESA "DRI_Mesa"
|
|
|
|
/** Core struct that appears alongside __DRI_CORE for Mesa-internal usage.
|
|
* Implemented in the top-level dri/drisw/kopper extension list.
|
|
*/
|
|
typedef struct {
|
|
__DRIextension base;
|
|
|
|
/* Version string for verifying that the DRI driver is from the same build as
|
|
* the loader.
|
|
*/
|
|
#define MESA_INTERFACE_VERSION_STRING PACKAGE_VERSION MESA_GIT_SHA1
|
|
const char *version_string;
|
|
|
|
|
|
__DRIcreateContextAttribsFunc createContext;
|
|
|
|
/* driver function for finishing initialization inside createNewScreen(). */
|
|
const struct dri_config **(*initScreen)(struct dri_screen *screen, bool driver_name_is_inferred);
|
|
|
|
int (*queryCompatibleRenderOnlyDeviceFd)(int kms_only_fd);
|
|
|
|
/* Screen creation function regardless of DRI2, image, or swrast backend.
|
|
* (Nothing uses the old __DRI_CORE screen create).
|
|
*
|
|
* If not associated with a DRM fd (non-swkms swrast), the fd argument should
|
|
* be -1.
|
|
*/
|
|
/* version 2 */
|
|
__DRIcreateNewScreen3Func createNewScreen3;
|
|
} __DRImesaCoreExtension;
|
|
|
|
#endif /* MESA_INTERFACE_H */
|