[Mesa-dev] [PATCH 03/11] mesa: Add state data structures requried for ARB_shader_image_load_store.
Chris Forbes
chrisf at ijw.co.nz
Mon Nov 25 09:57:28 PST 2013
That makes good sense.
On Tue, Nov 26, 2013 at 6:45 AM, Francisco Jerez <currojerez at riseup.net> wrote:
> Chris Forbes <chrisf at ijw.co.nz> writes:
>
>> In the commit message, s/requried/required/
>>
>> Does holding onto the whole texture object make things easier? I had
>> assumed you could get by just referencing the right gl_texture_image,
>> but maybe that doesn't work out.
>>
>
> Yes, it does for many reasons: First, if we only kept a reference to the
> teximage we would still need to reference the texture object to prevent
> it from being deleted. Second, it would be hard to deal with cases like
> the binding of an incomplete mipmap to an image unit that is only
> completed afterwards -- that would make the teximage reference go stale.
> Third, in array and cubemap textures, there is no "right" teximage, we
> may want to bind all images present in some specific level.
>
> Thanks for the quick response. :)
>
>> On Mon, Nov 25, 2013 at 6:00 PM, Francisco Jerez <currojerez at riseup.net> wrote:
>>> ---
>>> src/mesa/main/config.h | 1 +
>>> src/mesa/main/dd.h | 1 +
>>> src/mesa/main/mtypes.h | 100 +++++++++++++++++++++++++++++++++++++++++++++++++
>>> src/mesa/main/texobj.c | 1 +
>>> 4 files changed, 103 insertions(+)
>>>
>>> diff --git a/src/mesa/main/config.h b/src/mesa/main/config.h
>>> index 22bbfa0..8bd9765 100644
>>> --- a/src/mesa/main/config.h
>>> +++ b/src/mesa/main/config.h
>>> @@ -175,6 +175,7 @@
>>> #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_UNITS 32
>>> /*@}*/
>>>
>>> /**
>>> diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
>>> index b5b874f..648062f 100644
>>> --- a/src/mesa/main/dd.h
>>> +++ b/src/mesa/main/dd.h
>>> @@ -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;
>>> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
>>> index e9750f4..7be0664 100644
>>> --- a/src/mesa/main/mtypes.h
>>> +++ b/src/mesa/main/mtypes.h
>>> @@ -1207,6 +1207,9 @@ struct gl_texture_object
>>>
>>> /** GL_OES_EGL_image_external */
>>> GLint RequiredTextureImageUnits;
>>> +
>>> + /** GL_ARB_shader_image_load_store */
>>> + GLenum ImageFormatCompatibility;
>>> };
>>>
>>>
>>> @@ -2373,6 +2376,29 @@ 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_UNITS];
>>> +
>>> + /**
>>> + * Access qualifier specified in the shader for each image uniform.
>>> + * 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_UNITS];
>>> +
>>> + /**
>>> + * Number of image uniforms defined in the shader.
>>> + */
>>> + GLuint NumImages;
>>> };
>>>
>>>
>>> @@ -3077,9 +3103,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;
>>> };
>>>
>>>
>>> @@ -3302,6 +3332,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;
>>> };
>>>
>>>
>>> @@ -3727,6 +3763,11 @@ struct gl_driver_flags
>>> * gl_context::AtomicBufferBindings
>>> */
>>> GLbitfield NewAtomicBuffer;
>>> +
>>> + /**
>>> + * gl_context::ImageUnits
>>> + */
>>> + GLbitfield NewImageUnits;
>>> };
>>>
>>> struct gl_uniform_buffer_binding
>>> @@ -3744,6 +3785,60 @@ struct gl_uniform_buffer_binding
>>> };
>>>
>>> /**
>>> + * 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 \c
>>> + * Layered is \c GL_TRUE.
>>> + */
>>> + 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.
>>> */
>>> struct gl_atomic_buffer_binding
>>> @@ -3933,6 +4028,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 */
>>> diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
>>> index abd30c5..4f732fc 100644
>>> --- a/src/mesa/main/texobj.c
>>> +++ b/src/mesa/main/texobj.c
>>> @@ -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->ImageFormatCompatibility = GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE;
>>> }
>>>
>>>
>>> --
>>> 1.8.3.4
>>>
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list