[Mesa-dev] [PATCH 4/5] mesa: Fix glGetUniformfv of native integer uniforms.

Dan McCabe zen3d.linux at gmail.com
Sat Aug 20 13:07:33 PDT 2011


On 08/20/2011 12:16 AM, Kenneth Graunke wrote:
> On 08/19/2011 05:56 PM, Eric Anholt wrote:
>> We have to actually convert the values on the way out.  Fixes piglit
>> ARB_shader_objects/getuniform.
>> ---
>>   src/mesa/main/uniforms.c |   32 ++++++++++++++++++++++++++++----
>>   1 files changed, 28 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c
>> index cda840f..fbaa810 100644
>> --- a/src/mesa/main/uniforms.c
>> +++ b/src/mesa/main/uniforms.c
>> @@ -55,13 +55,11 @@ static GLenum
>>   base_uniform_type(GLenum type)
>>   {
>>      switch (type) {
>> -#if 0 /* not needed, for now */
>>      case GL_BOOL:
>>      case GL_BOOL_VEC2:
>>      case GL_BOOL_VEC3:
>>      case GL_BOOL_VEC4:
>>         return GL_BOOL;
>> -#endif
>>      case GL_FLOAT:
>>      case GL_FLOAT_VEC2:
>>      case GL_FLOAT_VEC3:
>> @@ -408,8 +406,12 @@ get_uniform(struct gl_context *ctx, GLuint program, GLint location,
>>      else {
>>         const struct gl_program_parameter *p =
>>            &prog->Parameters->Parameters[paramPos];
>> +      gl_constant_value (*values)[4];
>>         GLint rows, cols, i, j, k;
>>         GLsizei numBytes;
>> +      GLenum storage_type;
>> +
>> +      values = prog->Parameters->ParameterValues + paramPos + offset;
>>
>>         get_uniform_rows_cols(p,&rows,&cols);
>>
>> @@ -421,15 +423,37 @@ get_uniform(struct gl_context *ctx, GLuint program, GLint location,
>>            return;
>>         }
>>
>> +      if (ctx->Const.NativeIntegers) {
>> +	 storage_type = base_uniform_type(p->DataType);
>> +      } else {
>> +	 storage_type = GL_FLOAT;
>> +      }
>> +
>>         switch (returnType) {
>>         case GL_FLOAT:
>>            {
>>               GLfloat *params = (GLfloat *) paramsOut;
>>               k = 0;
>>               for (i = 0; i<  rows; i++) {
>> -               const int base = paramPos + offset + i;
>>                  for (j = 0; j<  cols; j++ ) {
>> -                  params[k++] = prog->Parameters->ParameterValues[base][j].f;
>> +		  switch (storage_type) {
>> +		  case GL_FLOAT:
>> +		     params[k++] = values[i][j].f;
>> +		     break;
>> +		  case GL_INT:
>> +		     params[k++] = values[i][j].i;
>> +		     break;
>> +		  case GL_UNSIGNED_INT:
>> +		     params[k++] = values[i][j].u;
>> +		     break;
>> +		  case GL_BOOL:
>> +		     params[k++] = values[i][j].b;
>> +		     break;
>> +		  default:
>> +		     _mesa_problem(ctx, "Invalid type in glGetUniform()");
>> +		     params[k++] = 0.0;
>> +		     break;
>> +		  }
>>                  }
>>               }
>>            }
>
> Argh.  The OpenGL specification is so unclear on what happens when you
> call GetUniform{f, i, ui}v on a value of a different type.  Your code
> here assumes that it's legal to call GetUniformfv on an int/bool/uint
> uniform, and that the uniform's value should be implicitly converted to
> floating point.  That seems plausible.
>
> But what about calling GetUniformiv or GetUniformuiv on a float uniform?
>   Is it supposed to convert the float value to an int/uint?  By what
> rounding rules...truncate?  We're certainly not doing that now.  If
> that's the proper behavior, we need your switch statement in the GL_INT
> and GL_UNSIGNED_INT returnType cases as well.
>
> We also do need it for the GL_DOUBLE returnType case.  (Admittedly
> that's a GL 4 function we don't implement, but we may as well get it
> right now...)

Ditto.

> _______________________________________________
> 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