mesa: add support for GL_PRIMITIVE_BOUNDING_BOX storage and query
authorIlia Mirkin <imirkin@alum.mit.edu>
Mon, 30 May 2016 16:54:23 +0000 (12:54 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Wed, 31 Aug 2016 00:25:15 +0000 (20:25 -0400)
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/main/bbox.c
src/mesa/main/get.c
src/mesa/main/get_hash_params.py
src/mesa/main/mtypes.h

index 0ef5705532cb7ec09e21821221d35a0241281300..21843308bf693d70f0c001ab2fd0ecd744736ec8 100644 (file)
@@ -36,9 +36,28 @@ _mesa_PrimitiveBoundingBox(
       GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW,
       GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW)
 {
+   GET_CURRENT_CONTEXT(ctx);
+
+   ctx->PrimitiveBoundingBox[0] = minX;
+   ctx->PrimitiveBoundingBox[1] = minY;
+   ctx->PrimitiveBoundingBox[2] = minZ;
+   ctx->PrimitiveBoundingBox[3] = minW;
+   ctx->PrimitiveBoundingBox[4] = maxX;
+   ctx->PrimitiveBoundingBox[5] = maxY;
+   ctx->PrimitiveBoundingBox[6] = maxZ;
+   ctx->PrimitiveBoundingBox[7] = maxW;
 }
 
 void
 _mesa_init_bbox(struct gl_context *ctx)
 {
+   ctx->PrimitiveBoundingBox[0] =
+   ctx->PrimitiveBoundingBox[1] =
+   ctx->PrimitiveBoundingBox[2] = -1.0f;
+
+   ctx->PrimitiveBoundingBox[3] =
+   ctx->PrimitiveBoundingBox[4] =
+   ctx->PrimitiveBoundingBox[5] =
+   ctx->PrimitiveBoundingBox[6] =
+   ctx->PrimitiveBoundingBox[7] = 1.0f;
 }
index def2ca559862e54d4b78470a1cd94b45b4583627..810ccb9e396bfc0ad9a0f3933128070f67538d0b 100644 (file)
@@ -111,6 +111,7 @@ enum value_type {
    TYPE_FLOAT_2,
    TYPE_FLOAT_3,
    TYPE_FLOAT_4,
+   TYPE_FLOAT_8,
    TYPE_FLOATN,
    TYPE_FLOATN_2,
    TYPE_FLOATN_3,
@@ -218,6 +219,7 @@ union value {
 #define CONTEXT_FLOAT2(field) CONTEXT_FIELD(field, TYPE_FLOAT_2)
 #define CONTEXT_FLOAT3(field) CONTEXT_FIELD(field, TYPE_FLOAT_3)
 #define CONTEXT_FLOAT4(field) CONTEXT_FIELD(field, TYPE_FLOAT_4)
+#define CONTEXT_FLOAT8(field) CONTEXT_FIELD(field, TYPE_FLOAT_8)
 #define CONTEXT_MATRIX(field) CONTEXT_FIELD(field, TYPE_MATRIX)
 #define CONTEXT_MATRIX_T(field) CONTEXT_FIELD(field, TYPE_MATRIX_T)
 
@@ -467,6 +469,7 @@ EXTRA_EXT(NVX_gpu_memory_info);
 EXTRA_EXT(ARB_cull_distance);
 EXTRA_EXT(EXT_window_rectangles);
 EXTRA_EXT(KHR_blend_equation_advanced_coherent);
+EXTRA_EXT(OES_primitive_bounding_box);
 
 static const int
 extra_ARB_color_buffer_float_or_glcore[] = {
@@ -1391,6 +1394,11 @@ _mesa_GetBooleanv(GLenum pname, GLboolean *params)
       params[0] = INT_TO_BOOLEAN(d->offset);
       break;
 
+   case TYPE_FLOAT_8:
+      params[7] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[7]);
+      params[6] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[6]);
+      params[5] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[5]);
+      params[4] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[4]);
    case TYPE_FLOAT_4:
    case TYPE_FLOATN_4:
       params[3] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[3]);
@@ -1479,6 +1487,11 @@ _mesa_GetFloatv(GLenum pname, GLfloat *params)
       params[0] = (GLfloat) d->offset;
       break;
 
+   case TYPE_FLOAT_8:
+      params[7] = ((GLfloat *) p)[7];
+      params[6] = ((GLfloat *) p)[6];
+      params[5] = ((GLfloat *) p)[5];
+      params[4] = ((GLfloat *) p)[4];
    case TYPE_FLOAT_4:
    case TYPE_FLOATN_4:
       params[3] = ((GLfloat *) p)[3];
@@ -1567,6 +1580,11 @@ _mesa_GetIntegerv(GLenum pname, GLint *params)
       params[0] = d->offset;
       break;
 
+   case TYPE_FLOAT_8:
+      params[7] = IROUND(((GLfloat *) p)[7]);
+      params[6] = IROUND(((GLfloat *) p)[6]);
+      params[5] = IROUND(((GLfloat *) p)[5]);
+      params[4] = IROUND(((GLfloat *) p)[4]);
    case TYPE_FLOAT_4:
       params[3] = IROUND(((GLfloat *) p)[3]);
    case TYPE_FLOAT_3:
@@ -1661,6 +1679,11 @@ _mesa_GetInteger64v(GLenum pname, GLint64 *params)
       params[0] = d->offset;
       break;
 
+   case TYPE_FLOAT_8:
+      params[7] = IROUND64(((GLfloat *) p)[7]);
+      params[6] = IROUND64(((GLfloat *) p)[6]);
+      params[5] = IROUND64(((GLfloat *) p)[5]);
+      params[4] = IROUND64(((GLfloat *) p)[4]);
    case TYPE_FLOAT_4:
       params[3] = IROUND64(((GLfloat *) p)[3]);
    case TYPE_FLOAT_3:
@@ -1755,6 +1778,11 @@ _mesa_GetDoublev(GLenum pname, GLdouble *params)
       params[0] = d->offset;
       break;
 
+   case TYPE_FLOAT_8:
+      params[7] = ((GLfloat *) p)[7];
+      params[6] = ((GLfloat *) p)[6];
+      params[5] = ((GLfloat *) p)[5];
+      params[4] = ((GLfloat *) p)[4];
    case TYPE_FLOAT_4:
    case TYPE_FLOATN_4:
       params[3] = ((GLfloat *) p)[3];
index 35af48b96aae00066c800a6e939484cba4ae3a9f..a206c851f7e31d2c6eeee06c70bba77c28a3ecfb 100644 (file)
@@ -607,6 +607,9 @@ descriptor=[
 
 # GL_ARB_texture_buffer_range
   [ "TEXTURE_BUFFER_OFFSET_ALIGNMENT", "CONTEXT_INT(Const.TextureBufferOffsetAlignment), extra_ARB_texture_buffer_range" ],
+
+# GL_OES_primitive_bounding_box
+  [ "PRIMITIVE_BOUNDING_BOX_ARB", "CONTEXT_FLOAT8(PrimitiveBoundingBox), extra_OES_primitive_bounding_box" ],
 ]},
 
 # Remaining enums are only in OpenGL
index c7ed1b3cfd4afd04ceccd8d103e94acf698c01e0..d2bc0b5fa900410472bc2eec26e655f20864e349 100644 (file)
@@ -4673,6 +4673,13 @@ struct gl_context
     * Once this field becomes true, it is never reset to false.
     */
    GLboolean ShareGroupReset;
+
+   /**
+    * \name OES_primitive_bounding_box
+    *
+    * Stores the arguments to glPrimitiveBoundingBox
+    */
+   GLfloat PrimitiveBoundingBox[8];
 };
 
 /**