TYPE_UINT_3,
TYPE_UINT_4,
TYPE_INT64,
+ TYPE_ENUM16,
TYPE_ENUM,
TYPE_ENUM_2,
TYPE_BOOLEAN,
+ TYPE_UBYTE,
+ TYPE_SHORT,
TYPE_BIT_0,
TYPE_BIT_1,
TYPE_BIT_2,
EXTRA_VERSION_31,
EXTRA_VERSION_32,
EXTRA_VERSION_40,
+ EXTRA_VERSION_43,
EXTRA_API_GL,
EXTRA_API_GL_CORE,
EXTRA_API_ES2,
GLint value_int_4[4];
GLint64 value_int64;
GLenum value_enum;
+ GLubyte value_ubyte;
+ GLshort value_short;
+ GLuint value_uint;
/* Sigh, see GL_COMPRESSED_TEXTURE_FORMATS_ARB handling */
struct {
#define BUFFER_INT(field) BUFFER_FIELD(field, TYPE_INT)
#define BUFFER_ENUM(field) BUFFER_FIELD(field, TYPE_ENUM)
+#define BUFFER_ENUM16(field) BUFFER_FIELD(field, TYPE_ENUM16)
#define BUFFER_BOOL(field) BUFFER_FIELD(field, TYPE_BOOLEAN)
#define CONTEXT_INT(field) CONTEXT_FIELD(field, TYPE_INT)
#define CONTEXT_INT2(field) CONTEXT_FIELD(field, TYPE_INT_2)
#define CONTEXT_INT64(field) CONTEXT_FIELD(field, TYPE_INT64)
#define CONTEXT_UINT(field) CONTEXT_FIELD(field, TYPE_UINT)
+#define CONTEXT_ENUM16(field) CONTEXT_FIELD(field, TYPE_ENUM16)
#define CONTEXT_ENUM(field) CONTEXT_FIELD(field, TYPE_ENUM)
#define CONTEXT_ENUM2(field) CONTEXT_FIELD(field, TYPE_ENUM_2)
#define CONTEXT_BOOL(field) CONTEXT_FIELD(field, TYPE_BOOLEAN)
#define CONTEXT_MATRIX(field) CONTEXT_FIELD(field, TYPE_MATRIX)
#define CONTEXT_MATRIX_T(field) CONTEXT_FIELD(field, TYPE_MATRIX_T)
+/* Vertex array fields */
#define ARRAY_INT(field) ARRAY_FIELD(field, TYPE_INT)
#define ARRAY_ENUM(field) ARRAY_FIELD(field, TYPE_ENUM)
+#define ARRAY_ENUM16(field) ARRAY_FIELD(field, TYPE_ENUM16)
#define ARRAY_BOOL(field) ARRAY_FIELD(field, TYPE_BOOLEAN)
+#define ARRAY_UBYTE(field) ARRAY_FIELD(field, TYPE_UBYTE)
+#define ARRAY_SHORT(field) ARRAY_FIELD(field, TYPE_SHORT)
#define EXT(f) \
offsetof(struct gl_extensions, f)
EXTRA_EXT(EXT_stencil_two_side);
EXTRA_EXT(EXT_depth_bounds_test);
EXTRA_EXT(ARB_depth_clamp);
+EXTRA_EXT(AMD_depth_clamp_separate);
EXTRA_EXT(ATI_fragment_shader);
EXTRA_EXT(EXT_provoking_vertex);
EXTRA_EXT(ARB_fragment_shader);
EXTRA_EXT(ARB_compute_variable_group_size);
EXTRA_EXT(KHR_robustness);
EXTRA_EXT(ARB_sparse_buffer);
+EXTRA_EXT(NV_conservative_raster);
+EXTRA_EXT(NV_conservative_raster_dilate);
+EXTRA_EXT(NV_conservative_raster_pre_snap_triangles);
+EXTRA_EXT(ARB_sample_locations);
+EXTRA_EXT(AMD_framebuffer_multisample_advanced);
static const int
extra_ARB_color_buffer_float_or_glcore[] = {
static const int extra_version_30[] = { EXTRA_VERSION_30, EXTRA_END };
static const int extra_version_31[] = { EXTRA_VERSION_31, EXTRA_END };
static const int extra_version_32[] = { EXTRA_VERSION_32, EXTRA_END };
+static const int extra_version_43[] = { EXTRA_VERSION_43, EXTRA_END };
static const int extra_gl30_es3[] = {
EXTRA_VERSION_30,
static const int extra_EXT_shader_framebuffer_fetch[] = {
EXTRA_API_ES2,
EXTRA_API_ES3,
- EXT(MESA_shader_framebuffer_fetch),
+ EXT(EXT_shader_framebuffer_fetch),
EXTRA_END
};
break;
case GL_COLOR_WRITEMASK:
- v->value_int_4[0] = ctx->Color.ColorMask[0][RCOMP] ? 1 : 0;
- v->value_int_4[1] = ctx->Color.ColorMask[0][GCOMP] ? 1 : 0;
- v->value_int_4[2] = ctx->Color.ColorMask[0][BCOMP] ? 1 : 0;
- v->value_int_4[3] = ctx->Color.ColorMask[0][ACOMP] ? 1 : 0;
+ v->value_int_4[0] = GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 0);
+ v->value_int_4[1] = GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 1);
+ v->value_int_4[2] = GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 2);
+ v->value_int_4[3] = GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 3);
+ break;
+
+ case GL_DEPTH_CLAMP:
+ v->value_bool = ctx->Transform.DepthClampNear || ctx->Transform.DepthClampFar;
break;
case GL_EDGE_FLAG:
v->value_int = 0;
}
break;
+ /* GL 4.3 */
+ case GL_NUM_SHADING_LANGUAGE_VERSIONS:
+ v->value_int = _mesa_get_shading_language_version(ctx, -1, NULL);
+ break;
/* GL_ARB_draw_indirect */
case GL_DRAW_INDIRECT_BUFFER_BINDING:
v->value_int = ctx->DrawIndirectBuffer->Name;
simple_mtx_unlock(&ctx->Shared->Mutex);
}
break;
+ /* GL_ARB_sample_locations */
+ case GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB:
+ case GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB:
+ case GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB:
+ {
+ GLuint bits, width, height;
+
+ if (ctx->NewState & _NEW_BUFFERS)
+ _mesa_update_state(ctx);
+
+ if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE) {
+ v->value_uint = 0;
+ break;
+ }
+
+ ctx->Driver.GetProgrammableSampleCaps(ctx, ctx->DrawBuffer,
+ &bits, &width, &height);
+
+ if (d->pname == GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB)
+ v->value_uint = width;
+ else if (d->pname == GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB)
+ v->value_uint = height;
+ else
+ v->value_uint = bits;
+ }
+ break;
+ case GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB:
+ v->value_uint = MAX_SAMPLE_LOCATION_TABLE_SIZE;
+ break;
+
+ /* GL_AMD_framebuffer_multisample_advanced */
+ case GL_SUPPORTED_MULTISAMPLE_MODES_AMD:
+ v->value_int_n.n = ctx->Const.NumSupportedMultisampleModes * 3;
+ memcpy(v->value_int_n.ints, ctx->Const.SupportedMultisampleModes,
+ v->value_int_n.n * sizeof(GLint));
+ break;
}
}
if (version >= 32)
api_found = GL_TRUE;
break;
+ case EXTRA_VERSION_40:
+ api_check = GL_TRUE;
+ if (version >= 40)
+ api_found = GL_TRUE;
+ break;
+ case EXTRA_VERSION_43:
+ api_check = TRUE;
+ if (_mesa_is_desktop_gl(ctx) && version >= 43)
+ api_found = GL_TRUE;
+ break;
case EXTRA_NEW_FRAG_CLAMP:
if (ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP))
_mesa_update_state(ctx);
find_value(const char *func, GLenum pname, void **p, union value *v)
{
GET_CURRENT_CONTEXT(ctx);
- struct gl_texture_unit *unit;
int mask, hash;
const struct value_desc *d;
int api;
*p = ((char *) ctx->Array.VAO + d->offset);
return d;
case LOC_TEXUNIT:
- unit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
- *p = ((char *) unit + d->offset);
+ if (ctx->Texture.CurrentUnit < ARRAY_SIZE(ctx->Texture.FixedFuncUnit)) {
+ unsigned index = ctx->Texture.CurrentUnit;
+ *p = ((char *)&ctx->Texture.FixedFuncUnit[index] + d->offset);
+ }
return d;
case LOC_CUSTOM:
find_custom_value(ctx, d, v);
case TYPE_INT64:
return sizeof(GLint64);
break;
+ case TYPE_ENUM16:
+ return sizeof(GLenum16);
case TYPE_ENUM:
return sizeof(GLenum);
case TYPE_ENUM_2:
return sizeof(GLenum) * 2;
case TYPE_BOOLEAN:
return sizeof(GLboolean);
+ case TYPE_UBYTE:
+ return sizeof(GLubyte);
+ case TYPE_SHORT:
+ return sizeof(GLshort);
case TYPE_BIT_0:
case TYPE_BIT_1:
case TYPE_BIT_2:
params[0] = INT_TO_BOOLEAN(((GLint *) p)[0]);
break;
+ case TYPE_ENUM16:
+ params[0] = INT_TO_BOOLEAN(((GLenum16 *) p)[0]);
+ break;
+
case TYPE_INT_N:
for (i = 0; i < v.value_int_n.n; i++)
params[i] = INT_TO_BOOLEAN(v.value_int_n.ints[i]);
params[0] = ((GLboolean*) p)[0];
break;
+ case TYPE_UBYTE:
+ params[0] = INT_TO_BOOLEAN(((GLubyte *) p)[0]);
+ break;
+
+ case TYPE_SHORT:
+ params[0] = INT_TO_BOOLEAN(((GLshort *) p)[0]);
+ break;
+
case TYPE_MATRIX:
m = *(GLmatrix **) p;
for (i = 0; i < 16; i++)
params[0] = (GLfloat) (((GLint *) p)[0]);
break;
+ case TYPE_ENUM16:
+ params[0] = (GLfloat) (((GLenum16 *) p)[0]);
+ break;
+
case TYPE_INT_N:
for (i = 0; i < v.value_int_n.n; i++)
params[i] = (GLfloat) v.value_int_n.ints[i];
params[0] = BOOLEAN_TO_FLOAT(*(GLboolean*) p);
break;
+ case TYPE_UBYTE:
+ params[0] = (GLfloat) ((GLubyte *) p)[0];
+ break;
+
+ case TYPE_SHORT:
+ params[0] = (GLfloat) ((GLshort *) p)[0];
+ break;
+
case TYPE_MATRIX:
m = *(GLmatrix **) p;
for (i = 0; i < 16; i++)
params[0] = ((GLint *) p)[0];
break;
+ case TYPE_ENUM16:
+ params[0] = ((GLenum16 *) p)[0];
+ break;
+
case TYPE_INT_N:
for (i = 0; i < v.value_int_n.n; i++)
params[i] = v.value_int_n.ints[i];
params[0] = BOOLEAN_TO_INT(*(GLboolean*) p);
break;
+ case TYPE_UBYTE:
+ params[0] = ((GLubyte *) p)[0];
+ break;
+
+ case TYPE_SHORT:
+ params[0] = ((GLshort *) p)[0];
+ break;
+
case TYPE_MATRIX:
m = *(GLmatrix **) p;
for (i = 0; i < 16; i++)
params[0] = ((GLint *) p)[0];
break;
+ case TYPE_ENUM16:
+ params[0] = ((GLenum16 *) p)[0];
+ break;
+
case TYPE_INT_N:
for (i = 0; i < v.value_int_n.n; i++)
- params[i] = INT_TO_BOOLEAN(v.value_int_n.ints[i]);
+ params[i] = v.value_int_n.ints[i];
break;
case TYPE_UINT_4:
params[0] = ((GLint *) p)[0];
break;
+ case TYPE_ENUM16:
+ params[0] = ((GLenum16 *) p)[0];
+ break;
+
case TYPE_INT_N:
for (i = 0; i < v.value_int_n.n; i++)
params[i] = v.value_int_n.ints[i];
params[0] = *(GLboolean*) p;
break;
+ case TYPE_UBYTE:
+ params[0] = ((GLubyte *) p)[0];
+ break;
+
+ case TYPE_SHORT:
+ params[0] = ((GLshort *) p)[0];
+ break;
+
case TYPE_MATRIX:
m = *(GLmatrix **) p;
for (i = 0; i < 16; i++)
const struct value_desc *d;
union value v;
int shift;
- void *p;
+ void *p = NULL;
GLsizei size;
const char *func = "glGetUnsignedBytevEXT";
d = find_value(func, pname, &p, &v);
size = get_value_size(d->type, &v);
- if (size >= 0) {
+ if (size <= 0) {
_mesa_problem(ctx, "invalid value type in GetUnsignedBytevEXT()");
}
case TYPE_ENUM:
case TYPE_ENUM_2:
case TYPE_BOOLEAN:
+ case TYPE_UBYTE:
+ case TYPE_SHORT:
case TYPE_FLOAT:
case TYPE_FLOATN:
case TYPE_FLOAT_2:
case TYPE_MATRIX_T:
memcpy(data, p, size);
break;
+ case TYPE_ENUM16: {
+ GLenum e = *(GLenum16 *)p;
+ memcpy(data, &e, sizeof(e));
+ break;
+ }
default:
break; /* nothing - GL error was recorded */
}
goto invalid_value;
if (!ctx->Extensions.EXT_draw_buffers2)
goto invalid_enum;
- v->value_int_4[0] = ctx->Color.ColorMask[index][RCOMP] ? 1 : 0;
- v->value_int_4[1] = ctx->Color.ColorMask[index][GCOMP] ? 1 : 0;
- v->value_int_4[2] = ctx->Color.ColorMask[index][BCOMP] ? 1 : 0;
- v->value_int_4[3] = ctx->Color.ColorMask[index][ACOMP] ? 1 : 0;
+ v->value_int_4[0] = GET_COLORMASK_BIT(ctx->Color.ColorMask, index, 0);
+ v->value_int_4[1] = GET_COLORMASK_BIT(ctx->Color.ColorMask, index, 1);
+ v->value_int_4[2] = GET_COLORMASK_BIT(ctx->Color.ColorMask, index, 2);
+ v->value_int_4[3] = GET_COLORMASK_BIT(ctx->Color.ColorMask, index, 3);
return TYPE_INT_4;
case GL_SCISSOR_BOX:
case GL_SAMPLER_BINDING: {
struct gl_sampler_object *samp;
- if (ctx->API != API_OPENGL_CORE)
+ if (!_mesa_is_desktop_gl(ctx) || ctx->Version < 33)
goto invalid_enum;
if (index >= _mesa_max_tex_unit(ctx))
goto invalid_value;
return TYPE_INT;
/* GL_EXT_external_objects */
+ case GL_NUM_DEVICE_UUIDS_EXT:
+ v->value_int = 1;
+ return TYPE_INT;
case GL_DRIVER_UUID_EXT:
+ if (index >= 1)
+ goto invalid_value;
_mesa_get_driver_uuid(ctx, v->value_int_4);
return TYPE_INT_4;
case GL_DEVICE_UUID_EXT:
+ if (index >= 1)
+ goto invalid_value;
_mesa_get_device_uuid(ctx, v->value_int_4);
return TYPE_INT_4;
}
params[1] = (GLfloat) v.value_int_4[1];
case TYPE_INT:
case TYPE_ENUM:
+ case TYPE_ENUM16:
params[0] = (GLfloat) v.value_int_4[0];
break;
params[0] = BOOLEAN_TO_FLOAT(v.value_bool);
break;
+ case TYPE_UBYTE:
+ params[0] = (GLfloat) v.value_ubyte;
+ break;
+
+ case TYPE_SHORT:
+ params[0] = (GLfloat) v.value_short;
+ break;
+
case TYPE_MATRIX:
m = *(GLmatrix **) &v;
for (i = 0; i < 16; i++)
params[1] = (GLdouble) v.value_int_4[1];
case TYPE_INT:
case TYPE_ENUM:
+ case TYPE_ENUM16:
params[0] = (GLdouble) v.value_int_4[0];
break;
params[0] = (GLdouble) BOOLEAN_TO_FLOAT(v.value_bool);
break;
+ case TYPE_UBYTE:
+ params[0] = (GLdouble) v.value_ubyte;
+ break;
+
+ case TYPE_SHORT:
+ params[0] = (GLdouble) v.value_short;
+ break;
+
case TYPE_MATRIX:
m = *(GLmatrix **) &v;
for (i = 0; i < 16; i++)
case TYPE_INT_4:
case TYPE_UINT_4:
case TYPE_INT64:
+ case TYPE_ENUM16:
case TYPE_ENUM:
case TYPE_ENUM_2:
case TYPE_BOOLEAN:
+ case TYPE_UBYTE:
+ case TYPE_SHORT:
case TYPE_FLOAT:
case TYPE_FLOATN:
case TYPE_FLOAT_2:
params[0] = INT_TO_FIXED(((GLint *) p)[0]);
break;
+ case TYPE_ENUM16:
+ params[0] = INT_TO_FIXED((GLint)(((GLenum16 *) p)[0]));
+ break;
+
case TYPE_INT_N:
for (i = 0; i < v.value_int_n.n; i++)
params[i] = INT_TO_FIXED(v.value_int_n.ints[i]);
params[0] = BOOLEAN_TO_FIXED(((GLboolean*) p)[0]);
break;
+ case TYPE_UBYTE:
+ params[0] = INT_TO_FIXED(((GLubyte *) p)[0]);
+ break;
+
+ case TYPE_SHORT:
+ params[0] = INT_TO_FIXED(((GLshort *) p)[0]);
+ break;
+
case TYPE_MATRIX:
m = *(GLmatrix **) p;
for (i = 0; i < 16; i++)