On 07/27/2017 03:08 PM, Timothy Arceri wrote:
From: Andres Rodriguez <andre...@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 <andre...@gmail.com>
Reviewed-by: Timothy Arceri <tarc...@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.pitoi...@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;

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to