[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