mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 02:40:11 +01:00
mesa: Add state data structures required for ARB_shader_image_load_store.
v2: Increase MAX_IMAGE_UNITS to what i965 wants and add a separate
MAX_IMAGE_UNIFORMS define, clarify a couple of comments.
Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
This commit is contained in:
parent
d9b0b4e960
commit
7a98741ef2
4 changed files with 108 additions and 0 deletions
|
|
@ -175,6 +175,9 @@
|
|||
#define MAX_COMBINED_ATOMIC_BUFFERS (MAX_UNIFORM_BUFFERS * 6)
|
||||
/* Size of an atomic counter in bytes according to ARB_shader_atomic_counters */
|
||||
#define ATOMIC_COUNTER_SIZE 4
|
||||
#define MAX_IMAGE_UNIFORMS 16
|
||||
/* 6 is for vertex, hull, domain, geometry, fragment, and compute shader. */
|
||||
#define MAX_IMAGE_UNITS (MAX_IMAGE_UNIFORMS * 6)
|
||||
/*@}*/
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ struct gl_buffer_object;
|
|||
struct gl_context;
|
||||
struct gl_display_list;
|
||||
struct gl_framebuffer;
|
||||
struct gl_image_unit;
|
||||
struct gl_pixelstore_attrib;
|
||||
struct gl_program;
|
||||
struct gl_renderbuffer;
|
||||
|
|
|
|||
|
|
@ -1230,6 +1230,9 @@ struct gl_texture_object
|
|||
|
||||
/** GL_OES_EGL_image_external */
|
||||
GLint RequiredTextureImageUnits;
|
||||
|
||||
/** GL_ARB_shader_image_load_store */
|
||||
GLenum ImageFormatCompatibilityType;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -2402,6 +2405,32 @@ struct gl_shader
|
|||
*/
|
||||
GLenum OutputType;
|
||||
} Geom;
|
||||
|
||||
/**
|
||||
* Map from image uniform index to image unit (set by glUniform1i())
|
||||
*
|
||||
* An image uniform index is associated with each image uniform by
|
||||
* the linker. The image index associated with each uniform is
|
||||
* stored in the \c gl_uniform_storage::image field.
|
||||
*/
|
||||
GLubyte ImageUnits[MAX_IMAGE_UNIFORMS];
|
||||
|
||||
/**
|
||||
* Access qualifier specified in the shader for each image uniform
|
||||
* index. Either \c GL_READ_ONLY, \c GL_WRITE_ONLY or \c
|
||||
* GL_READ_WRITE.
|
||||
*
|
||||
* It may be different, though only more strict than the value of
|
||||
* \c gl_image_unit::Access for the corresponding image unit.
|
||||
*/
|
||||
GLenum ImageAccess[MAX_IMAGE_UNIFORMS];
|
||||
|
||||
/**
|
||||
* Number of image uniforms defined in the shader. It specifies
|
||||
* the number of valid elements in the \c ImageUnits and \c
|
||||
* ImageAccess arrays above.
|
||||
*/
|
||||
GLuint NumImages;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -3089,9 +3118,13 @@ struct gl_program_constants
|
|||
GLuint MaxUniformBlocks;
|
||||
GLuint MaxCombinedUniformComponents;
|
||||
GLuint MaxTextureImageUnits;
|
||||
|
||||
/* GL_ARB_shader_atomic_counters */
|
||||
GLuint MaxAtomicBuffers;
|
||||
GLuint MaxAtomicCounters;
|
||||
|
||||
/* GL_ARB_shader_image_load_store */
|
||||
GLuint MaxImageUniforms;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -3312,6 +3345,12 @@ struct gl_constants
|
|||
/** GL_ARB_vertex_attrib_binding */
|
||||
GLint MaxVertexAttribRelativeOffset;
|
||||
GLint MaxVertexAttribBindings;
|
||||
|
||||
/* GL_ARB_shader_image_load_store */
|
||||
GLuint MaxImageUnits;
|
||||
GLuint MaxCombinedImageUnitsAndFragmentOutputs;
|
||||
GLuint MaxImageSamples;
|
||||
GLuint MaxCombinedImageUniforms;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -3737,6 +3776,11 @@ struct gl_driver_flags
|
|||
* gl_context::AtomicBufferBindings
|
||||
*/
|
||||
GLbitfield NewAtomicBuffer;
|
||||
|
||||
/**
|
||||
* gl_context::ImageUnits
|
||||
*/
|
||||
GLbitfield NewImageUnits;
|
||||
};
|
||||
|
||||
struct gl_uniform_buffer_binding
|
||||
|
|
@ -3753,6 +3797,60 @@ struct gl_uniform_buffer_binding
|
|||
GLboolean AutomaticSize;
|
||||
};
|
||||
|
||||
/**
|
||||
* ARB_shader_image_load_store image unit.
|
||||
*/
|
||||
struct gl_image_unit
|
||||
{
|
||||
/**
|
||||
* Texture object bound to this unit.
|
||||
*/
|
||||
struct gl_texture_object *TexObj;
|
||||
|
||||
/**
|
||||
* Level of the texture object bound to this unit.
|
||||
*/
|
||||
GLuint Level;
|
||||
|
||||
/**
|
||||
* \c GL_TRUE if the whole level is bound as an array of layers, \c
|
||||
* GL_FALSE if only some specific layer of the texture is bound.
|
||||
* \sa Layer
|
||||
*/
|
||||
GLboolean Layered;
|
||||
|
||||
/**
|
||||
* Layer of the texture object bound to this unit, or zero if the
|
||||
* whole level is bound.
|
||||
*/
|
||||
GLuint Layer;
|
||||
|
||||
/**
|
||||
* Access allowed to this texture image. Either \c GL_READ_ONLY,
|
||||
* \c GL_WRITE_ONLY or \c GL_READ_WRITE.
|
||||
*/
|
||||
GLenum Access;
|
||||
|
||||
/**
|
||||
* GL internal format that determines the interpretation of the
|
||||
* image memory when shader image operations are performed through
|
||||
* this unit.
|
||||
*/
|
||||
GLenum Format;
|
||||
|
||||
/**
|
||||
* Mesa format corresponding to \c Format.
|
||||
*/
|
||||
gl_format _ActualFormat;
|
||||
|
||||
/**
|
||||
* GL_TRUE if the state of this image unit is valid and access from
|
||||
* the shader is allowed. Otherwise loads from this unit should
|
||||
* return zero and stores should have no effect.
|
||||
*/
|
||||
GLboolean _Valid;
|
||||
};
|
||||
|
||||
/**
|
||||
* Binding point for an atomic counter buffer object.
|
||||
*/
|
||||
|
|
@ -3945,6 +4043,11 @@ struct gl_context
|
|||
struct gl_atomic_buffer_binding
|
||||
AtomicBufferBindings[MAX_COMBINED_ATOMIC_BUFFERS];
|
||||
|
||||
/**
|
||||
* Array of image units for ARB_shader_image_load_store.
|
||||
*/
|
||||
struct gl_image_unit ImageUnits[MAX_IMAGE_UNITS];
|
||||
|
||||
/*@}*/
|
||||
|
||||
struct gl_meta_state *Meta; /**< for "meta" operations */
|
||||
|
|
|
|||
|
|
@ -157,6 +157,7 @@ _mesa_initialize_texture_object( struct gl_context *ctx,
|
|||
obj->Sampler.sRGBDecode = GL_DECODE_EXT;
|
||||
obj->BufferObjectFormat = GL_R8;
|
||||
obj->_BufferObjectFormat = MESA_FORMAT_R8;
|
||||
obj->ImageFormatCompatibilityType = GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue