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

Samuel Pitoiset samuel.pitoiset at gmail.com
Fri Jul 28 09:52:33 UTC 2017



On 07/27/2017 03:08 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.
> 
> v2 (Timothy Arceri):
>   - remove extra break
>   - use _mesa_problem() rather the _mesa_error() for unimplemented
>     support for value types
> 
> Signed-off-by: Andres Rodriguez <andresx7 at gmail.com>
> Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
> ---
>   src/mesa/main/get.c | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 174 insertions(+)
> 
> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
> index 982f64a08a..75d77c80b0 100644
> --- a/src/mesa/main/get.c
> +++ b/src/mesa/main/get.c
> @@ -1424,20 +1424,86 @@ find_value(const char *func, GLenum pname, void **p, union value *v)
>      return &error_value;
>   }
>   
>   static const int transpose[] = {
>      0, 4,  8, 12,
>      1, 5,  9, 13,
>      2, 6, 10, 14,
>      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;
> +   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)
>   {
>      const struct value_desc *d;
>      union value v;
>      GLmatrix *m;
>      int shift, i;
>      void *p;
>   
>      d = find_value("glGetBooleanv", pname, &p, &v);
> @@ -1942,21 +2008,83 @@ _mesa_GetDoublev(GLenum pname, GLdouble *params)
>      case TYPE_BIT_7:
>         shift = d->type - TYPE_BIT_0;
>         params[0] = (*(GLbitfield *) p >> shift) & 1;
>         break;
>      }
>   }
>   
>   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_problem(ctx, "invalid value type in GetUnsignedBytevEXT()");

Still unclear to me if it's the right thing to do here. Either way, 
could be changed later on.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>

> +   }
> +
> +   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 */
> +   }
>   }
>   
>   /**
>    * Convert a GL texture binding enum such as GL_TEXTURE_BINDING_2D
>    * into the corresponding Mesa texture target index.
>    * \return TEXTURE_x_INDEX or -1 if binding is invalid
>    */
>   static int
>   tex_binding_to_index(const struct gl_context *ctx, GLenum binding)
>   {
> @@ -2653,21 +2781,67 @@ _mesa_GetDoublei_v(GLenum pname, GLuint index, GLdouble *params)
>         break;
>   
>      default:
>         ;
>      }
>   }
>   
>   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_problem(ctx, "invalid value type in GetUnsignedBytei_vEXT()");
> +   }
> +
> +   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_GetFixedv(GLenum pname, GLfixed *params)
>   {
>      const struct value_desc *d;
>      union value v;
>      GLmatrix *m;
>      int shift, i;
>      void *p;
> 


More information about the mesa-dev mailing list