[Mesa-dev] [PATCH 1/6] main: Added entry point for glCreateTransformFeedbacks

Martin Peres martin.peres at linux.intel.com
Thu Jan 29 06:09:18 PST 2015


On 29/01/15 15:37, Fredrik Höglund wrote:
> On Thursday 29 January 2015, Martin Peres wrote:
>> v2: Review from Laura Ekstrand
>> - generate the name of the gl method once
>> - shorten some lines to stay in the 78 chars limit
>>
>> Signed-off-by: Martin Peres <martin.peres at linux.intel.com>
>> ---
>>   src/mapi/glapi/gen/ARB_direct_state_access.xml |  7 +++
>>   src/mesa/main/tests/dispatch_sanity.cpp        |  1 +
>>   src/mesa/main/transformfeedback.c              | 63 ++++++++++++++++++++------
>>   src/mesa/main/transformfeedback.h              |  6 +++
>>   4 files changed, 62 insertions(+), 15 deletions(-)
>>
>> diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml b/src/mapi/glapi/gen/ARB_direct_state_access.xml
>> index 2fe1638..15b00c2 100644
>> --- a/src/mapi/glapi/gen/ARB_direct_state_access.xml
>> +++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml
>> @@ -7,6 +7,13 @@
>>      <enum name="QUERY_TARGET"    value="0x82EA"/>
>>      <enum name="TEXTURE_BINDING" value="0x82EB"/>
>>   
>> +   <!-- Transform Feedback object functions -->
>> +
>> +  <function name="CreateTransformFeedbacks" offset="assign">
>> +      <param name="n" type="GLsizei" />
>> +      <param name="ids" type="GLuint *" />
>> +   </function>
>> +
>>      <!-- Texture object functions -->
>>   
>>      <function name="CreateTextures" offset="assign">
>> diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp
>> index ee4db45..5e7f7ae 100644
>> --- a/src/mesa/main/tests/dispatch_sanity.cpp
>> +++ b/src/mesa/main/tests/dispatch_sanity.cpp
>> @@ -955,6 +955,7 @@ const struct function gl_core_functions_possible[] = {
>>      { "glClipControl", 45, -1 },
>>   
>>      /* GL_ARB_direct_state_access */
>> +   { "glCreateTransformFeedbacks", 45, -1 },
>>      { "glCreateTextures", 45, -1 },
>>      { "glTextureStorage1D", 45, -1 },
>>      { "glTextureStorage2D", 45, -1 },
>> diff --git a/src/mesa/main/transformfeedback.c b/src/mesa/main/transformfeedback.c
>> index a737463..b0fca48 100644
>> --- a/src/mesa/main/transformfeedback.c
>> +++ b/src/mesa/main/transformfeedback.c
>> @@ -825,25 +825,24 @@ _mesa_lookup_transform_feedback_object(struct gl_context *ctx, GLuint name)
>>            _mesa_HashLookup(ctx->TransformFeedback.Objects, name);
>>   }
>>   
>> -
>> -/**
>> - * Create new transform feedback objects.   Transform feedback objects
>> - * encapsulate the state related to transform feedback to allow quickly
>> - * switching state (and drawing the results, below).
>> - * Part of GL_ARB_transform_feedback2.
>> - */
>> -void GLAPIENTRY
>> -_mesa_GenTransformFeedbacks(GLsizei n, GLuint *names)
>> +void
>> +_mesa_create_transform_feedbacks(struct gl_context *ctx, GLsizei n,
>> +                                 GLuint *ids, bool dsa)
>>   {
>>      GLuint first;
>> -   GET_CURRENT_CONTEXT(ctx);
>> +   const char* gl_mthd_name;
> I would prefer it if you used a simpler name for this variable, such
> as "func".

Func seems like a good name. Thanks.
>
>> +   if (dsa)
>> +      gl_mthd_name = "glCreateTransformFeedbacks";
>> +   else
>> +      gl_mthd_name = "glGenTransformFeedbacks";
>>   
>>      if (n < 0) {
>> -      _mesa_error(ctx, GL_INVALID_VALUE, "glGenTransformFeedbacks(n < 0)");
>> +      _mesa_error(ctx, GL_INVALID_VALUE, "%s(n < 0)", gl_mthd_name);
>>         return;
>>      }
>>   
>> -   if (!names)
>> +   if (!ids)
>>         return;
>>   
>>      /* we don't need contiguous IDs, but this might be faster */
>> @@ -854,18 +853,52 @@ _mesa_GenTransformFeedbacks(GLsizei n, GLuint *names)
>>            struct gl_transform_feedback_object *obj
>>               = ctx->Driver.NewTransformFeedback(ctx, first + i);
>>            if (!obj) {
>> -            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenTransformFeedbacks");
>> +            _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", gl_mthd_name);
>>               return;
>>            }
>> -         names[i] = first + i;
>> +         ids[i] = first + i;
>>            _mesa_HashInsert(ctx->TransformFeedback.Objects, first + i, obj);
> You have to set EverBound to true when dsa is true. Otherwise
> glIsTransformFeedback() will return false when it's passed an ID that
> was created by glCreateTransformFeedbacks().

Good catch! I'm going to modify my piglit test to check for this 
behaviour. Thanks.
>
>>         }
>>      }
>>      else {
>> -      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenTransformFeedbacks");
>> +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", gl_mthd_name);
>>      }
>>   }
>>   
>> +/**
>> + * Create new transform feedback objects.   Transform feedback objects
>> + * encapsulate the state related to transform feedback to allow quickly
>> + * switching state (and drawing the results, below).
>> + * Part of GL_ARB_transform_feedback2.
>> + */
>> +void GLAPIENTRY
>> +_mesa_GenTransformFeedbacks(GLsizei n, GLuint *names)
>> +{
>> +   GET_CURRENT_CONTEXT(ctx);
>> +
>> +   /* GenTransformFeedbacks should just reserve the object names that a
>> +    * subsequent call to BindTransformFeedback should actively create. For
>> +    * the sake of simplicity, we reserve the names and create the objects
>> +    * straight away.
>> +    */
>> +   _mesa_create_transform_feedbacks(ctx, n, names, false);
>> +}
>> +
>> +/**
>> + * Create new transform feedback objects.   Transform feedback objects
>> + * encapsulate the state related to transform feedback to allow quickly
>> + * switching state (and drawing the results, below).
>> + * Part of GL_ARB_direct_state_access.
>> + */
>> +void GLAPIENTRY
>> +_mesa_CreateTransformFeedbacks(GLsizei n, GLuint *names)
>> +{
>> +   GET_CURRENT_CONTEXT(ctx);
>> +
>> +   _mesa_create_transform_feedbacks(ctx, n, names, true);
>> +}
>> +
>>   
>>   /**
>>    * Is the given ID a transform feedback object?
>> diff --git a/src/mesa/main/transformfeedback.h b/src/mesa/main/transformfeedback.h
>> index 87f4080..d598533 100644
>> --- a/src/mesa/main/transformfeedback.h
>> +++ b/src/mesa/main/transformfeedback.h
>> @@ -99,9 +99,15 @@ _mesa_init_transform_feedback_object(struct gl_transform_feedback_object *obj,
>>   struct gl_transform_feedback_object *
>>   _mesa_lookup_transform_feedback_object(struct gl_context *ctx, GLuint name);
>>   
>> +extern void
>> +_mesa_create_transform_feedbacks(struct gl_context *ctx, GLsizei n, GLuint *ids, bool dsa);
>> +
>>   extern void GLAPIENTRY
>>   _mesa_GenTransformFeedbacks(GLsizei n, GLuint *names);
>>   
>> +extern void GLAPIENTRY
>> +_mesa_CreateTransformFeedbacks(GLsizei n, GLuint *names);
>> +
>>   extern GLboolean GLAPIENTRY
>>   _mesa_IsTransformFeedback(GLuint name);
>>   
>>



More information about the mesa-dev mailing list