[Mesa-dev] [PATCH 03/11] mesa: Add state data structures requried for ARB_shader_image_load_store.

Francisco Jerez currojerez at riseup.net
Mon Nov 25 09:45:46 PST 2013


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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 229 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20131125/99fc8e2e/attachment-0001.pgp>


More information about the mesa-dev mailing list