[Mesa-dev] [PATCH v3 7/9] mesa: add *FramebufferTexture() support to frame_buffer_texture helper

Timothy Arceri tarceri at itsqueeze.com
Mon May 15 23:58:02 UTC 2017


On 16/05/17 00:06, Nicolai Hähnle wrote:
> On 11.05.2017 14:29, Timothy Arceri wrote:
>> ---
>>  src/mesa/main/fbobject.c | 138 
>> +++++++++++++----------------------------------
>>  1 file changed, 38 insertions(+), 100 deletions(-)
>>
>> diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
>> index 8e25dfa..0ff31ec 100644
>> --- a/src/mesa/main/fbobject.c
>> +++ b/src/mesa/main/fbobject.c
>> @@ -3420,26 +3420,35 @@ void GLAPIENTRY
>>  _mesa_FramebufferTexture3D(GLenum target, GLenum attachment,
>>                             GLenum textarget, GLuint texture,
>>                             GLint level, GLint layer)
>>  {
>>     framebuffer_texture_with_dims(3, target, attachment, textarget, 
>> texture,
>>                                   level, layer, 
>> "glFramebufferTexture3D");
>>  }
>>
>>
>>  static ALWAYS_INLINE void
>> -frame_buffer_texture_layer(GLuint framebuffer, GLenum target,
>> -                           GLenum attachment, GLuint texture,
>> -                           GLint level, GLint layer, const char *func,
>> -                           bool dsa, bool no_error)
>> +frame_buffer_texture(GLuint framebuffer, GLenum target,
>> +                     GLenum attachment, GLuint texture,
>> +                     GLint level, GLint layer, const char *func,
>> +                     bool dsa, bool no_error, bool check_layered)
>>  {
>>     GET_CURRENT_CONTEXT(ctx);
>> +   GLboolean layered = GL_FALSE;
>> +
>> +   if (!no_error && check_layered) {
>> +      if (!_mesa_has_geometry_shaders(ctx)) {
>> +         _mesa_error(ctx, GL_INVALID_OPERATION,
>> +                     "unsupported function (%s) called", func);
>> +         return;
>> +      }
>> +   }
>>
>>     /* Get the framebuffer object */
>>     struct gl_framebuffer *fb;
>>     if (no_error) {
>>        if (dsa) {
>>           fb = _mesa_lookup_framebuffer(ctx, framebuffer);
>>        } else {
>>           fb = get_framebuffer_target(ctx, target);
>>        }
>>     } else {
>> @@ -3457,184 +3466,113 @@ frame_buffer_texture_layer(GLuint 
>> framebuffer, GLenum target,
>>        }
>>     }
>>
>>     /* Get the texture object and framebuffer attachment*/
>>     struct gl_renderbuffer_attachment *att;
>>     struct gl_texture_object *texObj;
>>     if (no_error) {
>>        texObj = get_texture_for_framebuffer(ctx, texture);
>>        att = get_attachment(ctx, fb, attachment, NULL);
>>     } else {
>> -      if (!get_texture_for_framebuffer_err(ctx, texture, false, func,
>> +      if (!get_texture_for_framebuffer_err(ctx, texture, 
>> check_layered, func,
>>                                             &texObj))
>>           return;
>>
>>        att = _mesa_get_and_validate_attachment(ctx, fb, attachment, 
>> func);
>>        if (!att)
>>           return;
>>     }
>>
>>     GLenum textarget = 0;
>>     if (texObj) {
>>        if (!no_error) {
>> -         if (!check_texture_target(ctx, texObj->Target, func))
>> -            return;
>> +         if (check_layered) {
>> +            if (!check_layered_texture_target(ctx, texObj->Target, func,
>> +                                              &layered))
>> +               return;
> 
> It looks like layered is never set when no_error == true. Is that right?

Yeah this is wrong. I did have this right but I think I went back and 
changed it because I forgot it was setting layered. Will fix.

> 
> Cheers,
> Nicolai
> 
> 
>> +         } else {
>> +            if (!check_texture_target(ctx, texObj->Target, func))
>> +               return;
>>
>> -         if (!check_layer(ctx, texObj->Target, layer, func))
>> -            return;
>> +            if (!check_layer(ctx, texObj->Target, layer, func))
>> +               return;
>> +         }
>>
>>           if (!check_level(ctx, texObj->Target, level, func))
>>              return;
>>        }
>>
>> -      if (texObj->Target == GL_TEXTURE_CUBE_MAP) {
>> +      if (!check_layered && texObj->Target == GL_TEXTURE_CUBE_MAP) {
>>           assert(layer >= 0 && layer < 6);
>>           textarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + layer;
>>           layer = 0;
>>        }
>>     }
>>
>>     _mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, 
>> textarget,
>> -                             level, layer, GL_FALSE);
>> +                             level, layer, layered);
>>  }
>>
>>  void GLAPIENTRY
>>  _mesa_FramebufferTextureLayer_no_error(GLenum target, GLenum attachment,
>>                                         GLuint texture, GLint level,
>>                                         GLint layer)
>>  {
>> -   frame_buffer_texture_layer(0, target, attachment, texture, level, 
>> layer,
>> -                              "glFramebufferTextureLayer", false, true);
>> +   frame_buffer_texture(0, target, attachment, texture, level, layer,
>> +                        "glFramebufferTextureLayer", false, true, 
>> false);
>>  }
>>
>>
>>  void GLAPIENTRY
>>  _mesa_FramebufferTextureLayer(GLenum target, GLenum attachment,
>>                                GLuint texture, GLint level, GLint layer)
>>  {
>> -   frame_buffer_texture_layer(0, target, attachment, texture, level, 
>> layer,
>> -                              "glFramebufferTextureLayer", false, 
>> false);
>> +   frame_buffer_texture(0, target, attachment, texture, level, layer,
>> +                        "glFramebufferTextureLayer", false, false, 
>> false);
>>  }
>>
>>
>>  void GLAPIENTRY
>>  _mesa_NamedFramebufferTextureLayer_no_error(GLuint framebuffer,
>>                                              GLenum attachment,
>>                                              GLuint texture, GLint level,
>>                                              GLint layer)
>>  {
>> -   frame_buffer_texture_layer(framebuffer, 0, attachment, texture, 
>> level,
>> -                              layer, 
>> "glNamedFramebufferTextureLayer", true,
>> -                              true);
>> +   frame_buffer_texture(framebuffer, 0, attachment, texture, level, 
>> layer,
>> +                        "glNamedFramebufferTextureLayer", true, true, 
>> false);
>>  }
>>
>>
>>  void GLAPIENTRY
>>  _mesa_NamedFramebufferTextureLayer(GLuint framebuffer, GLenum 
>> attachment,
>>                                     GLuint texture, GLint level, GLint 
>> layer)
>>  {
>> -   frame_buffer_texture_layer(framebuffer, 0, attachment, texture, 
>> level,
>> -                              layer, 
>> "glNamedFramebufferTextureLayer", true,
>> -                              false);
>> +   frame_buffer_texture(framebuffer, 0, attachment, texture, level, 
>> layer,
>> +                        "glNamedFramebufferTextureLayer", true, 
>> false, false);
>>  }
>>
>>
>>  void GLAPIENTRY
>>  _mesa_FramebufferTexture(GLenum target, GLenum attachment,
>>                           GLuint texture, GLint level)
>>  {
>> -   GET_CURRENT_CONTEXT(ctx);
>> -   struct gl_framebuffer *fb;
>> -   struct gl_texture_object *texObj;
>> -   GLboolean layered = GL_FALSE;
>> -
>> -   const char *func = "FramebufferTexture";
>> -
>> -   if (!_mesa_has_geometry_shaders(ctx)) {
>> -      _mesa_error(ctx, GL_INVALID_OPERATION,
>> -                  "unsupported function (glFramebufferTexture) called");
>> -      return;
>> -   }
>> -
>> -   /* Get the framebuffer object */
>> -   fb = get_framebuffer_target(ctx, target);
>> -   if (!fb) {
>> -      _mesa_error(ctx, GL_INVALID_ENUM,
>> -                  "glFramebufferTexture(invalid target %s)",
>> -                  _mesa_enum_to_string(target));
>> -      return;
>> -   }
>> -
>> -   /* Get the texture object */
>> -   if (!get_texture_for_framebuffer_err(ctx, texture, true, func, 
>> &texObj))
>> -      return;
>> -
>> -   if (texObj) {
>> -      if (!check_layered_texture_target(ctx, texObj->Target, func, 
>> &layered))
>> -         return;
>> -
>> -      if (!check_level(ctx, texObj->Target, level, func))
>> -         return;
>> -   }
>> -
>> -   struct gl_renderbuffer_attachment *att =
>> -      _mesa_get_and_validate_attachment(ctx, fb, attachment, func);
>> -   if (!att)
>> -      return;
>> -
>> -   _mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, 0, level,
>> -                             0, layered);
>> +   frame_buffer_texture(0, target, attachment, texture, level, 0,
>> +                        "glFramebufferTexture", false, false, true);
>>  }
>>
>>
>>  void GLAPIENTRY
>>  _mesa_NamedFramebufferTexture(GLuint framebuffer, GLenum attachment,
>>                                GLuint texture, GLint level)
>>  {
>> -   GET_CURRENT_CONTEXT(ctx);
>> -   struct gl_framebuffer *fb;
>> -   struct gl_texture_object *texObj;
>> -   GLboolean layered = GL_FALSE;
>> -
>> -   const char *func = "glNamedFramebufferTexture";
>> -
>> -   if (!_mesa_has_geometry_shaders(ctx)) {
>> -      _mesa_error(ctx, GL_INVALID_OPERATION,
>> -                  "unsupported function (glNamedFramebufferTexture) 
>> called");
>> -      return;
>> -   }
>> -
>> -   /* Get the framebuffer object */
>> -   fb = _mesa_lookup_framebuffer_err(ctx, framebuffer, func);
>> -   if (!fb)
>> -      return;
>> -
>> -   /* Get the texture object */
>> -   if (!get_texture_for_framebuffer_err(ctx, texture, true, func, 
>> &texObj))
>> -      return;
>> -
>> -   if (texObj) {
>> -      if (!check_layered_texture_target(ctx, texObj->Target, func,
>> -                                        &layered))
>> -         return;
>> -
>> -      if (!check_level(ctx, texObj->Target, level, func))
>> -         return;
>> -   }
>> -
>> -   struct gl_renderbuffer_attachment *att =
>> -      _mesa_get_and_validate_attachment(ctx, fb, attachment, func);
>> -   if (!att)
>> -      return;
>> -
>> -   _mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, 0, level,
>> -                             0, layered);
>> +   frame_buffer_texture(framebuffer, 0, attachment, texture, level, 0,
>> +                        "glNamedFramebufferTexture", true, false, true);
>>  }
>>
>>
>>  void
>>  _mesa_framebuffer_renderbuffer(struct gl_context *ctx,
>>                                 struct gl_framebuffer *fb,
>>                                 GLenum attachment,
>>                                 struct gl_renderbuffer *rb)
>>  {
>>     assert(!_mesa_is_winsys_fbo(fb));
>>
> 
> 


More information about the mesa-dev mailing list