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:
Francisco Jerez 2013-11-22 21:15:26 -08:00
parent d9b0b4e960
commit 7a98741ef2
4 changed files with 108 additions and 0 deletions

View file

@ -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)
/*@}*/
/**

View file

@ -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;

View file

@ -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 */

View file

@ -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;
}