[Mesa-dev] [PATCH 16/24] mesa: implement glGetUnsignedByte{v|i_v}

Timothy Arceri tarceri at itsqueeze.com
Thu Jul 27 01:08:27 UTC 2017



On 27/07/17 11:00, Timothy Arceri wrote:
> 
> 
> On 27/07/17 01:34, Samuel Pitoiset wrote:
>>
>>
>> On 07/26/2017 01:46 PM, Timothy Arceri wrote:
>>> From: Andres Rodriguez <andresx7 at gmail.com>
>>>
>>> These are used by EXT_external_objects to present UUIDs for the device
>>> and the driver.
>>>
>>> Signed-off-by: Andres Rodriguez <andresx7 at gmail.com>
>>> Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
>>> ---
>>>   src/mesa/main/get.c | 177 
>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>   1 file changed, 177 insertions(+)
>>>
>>> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
>>> index 982f64a..77835e9 100644
>>> --- a/src/mesa/main/get.c
>>> +++ b/src/mesa/main/get.c
>>> @@ -1431,6 +1431,73 @@ static const int transpose[] = {
>>>      3, 7, 11, 15
>>>   };
>>> +static GLsizei
>>> +get_value_size(enum value_type type, const union value *v)
>>> +{
>>> +   switch (type) {
>>> +   case TYPE_INVALID:
>>> +      return 0;
>>> +   case TYPE_CONST:
>>> +   case TYPE_UINT:
>>> +   case TYPE_INT:
>>> +      return sizeof(GLint);
>>> +   case TYPE_INT_2:
>>> +   case TYPE_UINT_2:
>>> +      return sizeof(GLint) * 2;
>>> +   case TYPE_INT_3:
>>> +   case TYPE_UINT_3:
>>> +      return sizeof(GLint) * 3;
>>> +   case TYPE_INT_4:
>>> +   case TYPE_UINT_4:
>>> +      return sizeof(GLint) * 4;
>>> +   case TYPE_INT_N:
>>> +      return sizeof(GLint) * v->value_int_n.n;
>>> +   case TYPE_INT64:
>>> +      return sizeof(GLint64);
>>> +      break;
>>> +      break;
>>
>> Extra break.
>>
>>> +   case TYPE_ENUM:
>>> +      return sizeof(GLenum);
>>> +   case TYPE_ENUM_2:
>>> +      return sizeof(GLenum) * 2;
>>> +   case TYPE_BOOLEAN:
>>> +      return sizeof(GLboolean);
>>> +   case TYPE_BIT_0:
>>> +   case TYPE_BIT_1:
>>> +   case TYPE_BIT_2:
>>> +   case TYPE_BIT_3:
>>> +   case TYPE_BIT_4:
>>> +   case TYPE_BIT_5:
>>> +   case TYPE_BIT_6:
>>> +   case TYPE_BIT_7:
>>> +      return 1;
>>> +   case TYPE_FLOAT:
>>> +   case TYPE_FLOATN:
>>> +      return sizeof(GLfloat);
>>> +   case TYPE_FLOAT_2:
>>> +   case TYPE_FLOATN_2:
>>> +      return sizeof(GLfloat) * 2;
>>> +   case TYPE_FLOAT_3:
>>> +   case TYPE_FLOATN_3:
>>> +      return sizeof(GLfloat) * 3;
>>> +   case TYPE_FLOAT_4:
>>> +   case TYPE_FLOATN_4:
>>> +      return sizeof(GLfloat) * 4;
>>> +   case TYPE_FLOAT_8:
>>> +      return sizeof(GLfloat) * 8;
>>> +   case TYPE_DOUBLEN:
>>> +      return sizeof(GLdouble);
>>> +   case TYPE_DOUBLEN_2:
>>> +      return sizeof(GLdouble) * 2;
>>> +   case TYPE_MATRIX:
>>> +      return sizeof (GLfloat) * 16;
>>> +   case TYPE_MATRIX_T:
>>> +      return sizeof (GLfloat) * 16;
>>> +   default:
>>> +      return -1;
>>> +   }
>>> +}
>>> +
>>>   void GLAPIENTRY
>>>   _mesa_GetBooleanv(GLenum pname, GLboolean *params)
>>>   {
>>> @@ -1949,7 +2016,70 @@ _mesa_GetDoublev(GLenum pname, GLdouble *params)
>>>   void GLAPIENTRY
>>>   _mesa_GetUnsignedBytevEXT(GLenum pname, GLubyte *data)
>>>   {
>>> +   const struct value_desc *d;
>>> +   union value v;
>>> +   int shift;
>>> +   void *p;
>>> +   GLsizei size;
>>> +   const char *func = "glGetUnsignedBytevEXT";
>>> +
>>> +   GET_CURRENT_CONTEXT(ctx);
>>> +   d = find_value(func, pname, &p, &v);
>>> +   size = get_value_size(d->type, &v);
>>> +   if (size <= 0) {
>>> +      _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)",
>>> +                  func, _mesa_enum_to_string(pname));
>>> +   }
>>
>> Are you sure we need to return an error here?
> 
> yeah I'll change this to an assert I think

Actually I've changed it to call _mesa_problem()

> 
>>
>>> +
>>> +   switch (d->type) {
>>> +   case TYPE_BIT_0:
>>> +   case TYPE_BIT_1:
>>> +   case TYPE_BIT_2:
>>> +   case TYPE_BIT_3:
>>> +   case TYPE_BIT_4:
>>> +   case TYPE_BIT_5:
>>> +   case TYPE_BIT_6:
>>> +   case TYPE_BIT_7:
>>> +      shift = d->type - TYPE_BIT_0;
>>> +      data[0] = (*(GLbitfield *) p >> shift) & 1;
>>> +      break;
>>> +   case TYPE_CONST:
>>> +      memcpy(data, &d->offset, size);
>>> +      break;
>>> +   case TYPE_INT_N:
>>> +      memcpy(data, &v.value_int_n.ints, size);
>>> +      break;
>>> +   case TYPE_UINT:
>>> +   case TYPE_INT:
>>> +   case TYPE_INT_2:
>>> +   case TYPE_UINT_2:
>>> +   case TYPE_INT_3:
>>> +   case TYPE_UINT_3:
>>> +   case TYPE_INT_4:
>>> +   case TYPE_UINT_4:
>>> +   case TYPE_INT64:
>>> +   case TYPE_ENUM:
>>> +   case TYPE_ENUM_2:
>>> +   case TYPE_BOOLEAN:
>>> +   case TYPE_FLOAT:
>>> +   case TYPE_FLOATN:
>>> +   case TYPE_FLOAT_2:
>>> +   case TYPE_FLOATN_2:
>>> +   case TYPE_FLOAT_3:
>>> +   case TYPE_FLOATN_3:
>>> +   case TYPE_FLOAT_4:
>>> +   case TYPE_FLOATN_4:
>>> +   case TYPE_FLOAT_8:
>>> +   case TYPE_DOUBLEN:
>>> +   case TYPE_DOUBLEN_2:
>>> +   case TYPE_MATRIX:
>>> +   case TYPE_MATRIX_T:
>>> +      memcpy(data, p, size);
>>> +      break;
>>> +   default:
>>> +      break; /* nothing - GL error was recorded */
>>> +   }
>>>   }
>>>   /**
>>> @@ -2660,7 +2790,54 @@ _mesa_GetDoublei_v(GLenum pname, GLuint index, 
>>> GLdouble *params)
>>>   void GLAPIENTRY
>>>   _mesa_GetUnsignedBytei_vEXT(GLenum target, GLuint index, GLubyte 
>>> *data)
>>>   {
>>> +   GLsizei size;
>>> +   union value v;
>>> +   enum value_type type;
>>> +   const char *func = "glGetUnsignedBytei_vEXT";
>>> +
>>> +   GET_CURRENT_CONTEXT(ctx);
>>> +   type = find_value_indexed(func, target, index, &v);
>>> +   size = get_value_size(type, &v);
>>> +   if (size <= 0) {
>>> +      _mesa_error(ctx, GL_INVALID_ENUM, "%s(target=%s)",
>>> +                  func, _mesa_enum_to_string(target));
>>> +   }
>>> +
>>> +   switch (type) {
>>> +   case TYPE_UINT:
>>> +   case TYPE_INT:
>>> +   case TYPE_INT_2:
>>> +   case TYPE_UINT_2:
>>> +   case TYPE_INT_3:
>>> +   case TYPE_UINT_3:
>>> +   case TYPE_INT_4:
>>> +   case TYPE_UINT_4:
>>> +   case TYPE_INT64:
>>> +   case TYPE_ENUM:
>>> +   case TYPE_ENUM_2:
>>> +   case TYPE_BOOLEAN:
>>> +   case TYPE_FLOAT:
>>> +   case TYPE_FLOATN:
>>> +   case TYPE_FLOAT_2:
>>> +   case TYPE_FLOATN_2:
>>> +   case TYPE_FLOAT_3:
>>> +   case TYPE_FLOATN_3:
>>> +   case TYPE_FLOAT_4:
>>> +   case TYPE_FLOATN_4:
>>> +   case TYPE_FLOAT_8:
>>> +   case TYPE_DOUBLEN:
>>> +   case TYPE_DOUBLEN_2:
>>> +   case TYPE_MATRIX:
>>> +   case TYPE_MATRIX_T:
>>> +      memcpy(data, &v.value_int, size);
>>> +      break;
>>> +   case TYPE_INT_N:
>>> +      memcpy(data, &v.value_int_n.ints, size);
>>> +      break;
>>> +   default:
>>> +      break; /* nothing - GL error was recorded */
>>> +   }
>>>   }
>>>   void GLAPIENTRY
>>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list