mesa: allow drivers not to expose ARB_color_buffer_float in GL core profile
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
@@ -757,7 +757,8 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)
|
||||
* it's for the pixel path (ClampFragmentColor is GL_TRUE),
|
||||
* regardless of the internal implementation of the metaops.
|
||||
*/
|
||||
if (ctx->Color.ClampFragmentColor != GL_TRUE)
|
||||
if (ctx->Color.ClampFragmentColor != GL_TRUE &&
|
||||
ctx->Extensions.ARB_color_buffer_float)
|
||||
_mesa_ClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE);
|
||||
}
|
||||
|
||||
@@ -767,7 +768,8 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)
|
||||
/* Generally in here we never want vertex color clamping --
|
||||
* result clamping is only dependent on fragment clamping.
|
||||
*/
|
||||
_mesa_ClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE);
|
||||
if (ctx->Extensions.ARB_color_buffer_float)
|
||||
_mesa_ClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE);
|
||||
}
|
||||
|
||||
if (state & MESA_META_CONDITIONAL_RENDER) {
|
||||
@@ -1091,11 +1093,13 @@ _mesa_meta_end(struct gl_context *ctx)
|
||||
_mesa_DepthRange(save->DepthNear, save->DepthFar);
|
||||
}
|
||||
|
||||
if (state & MESA_META_CLAMP_FRAGMENT_COLOR) {
|
||||
if (state & MESA_META_CLAMP_FRAGMENT_COLOR &&
|
||||
ctx->Extensions.ARB_color_buffer_float) {
|
||||
_mesa_ClampColor(GL_CLAMP_FRAGMENT_COLOR, save->ClampFragmentColor);
|
||||
}
|
||||
|
||||
if (state & MESA_META_CLAMP_VERTEX_COLOR) {
|
||||
if (state & MESA_META_CLAMP_VERTEX_COLOR &&
|
||||
ctx->Extensions.ARB_color_buffer_float) {
|
||||
_mesa_ClampColor(GL_CLAMP_VERTEX_COLOR, save->ClampVertexColor);
|
||||
}
|
||||
|
||||
@@ -2044,7 +2048,8 @@ _mesa_meta_Clear(struct gl_context *ctx, GLbitfield buffers)
|
||||
/* leave colormask, glDrawBuffer state as-is */
|
||||
|
||||
/* Clears never have the color clamped. */
|
||||
_mesa_ClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE);
|
||||
if (ctx->Extensions.ARB_color_buffer_float)
|
||||
_mesa_ClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE);
|
||||
}
|
||||
else {
|
||||
ASSERT(metaSave & MESA_META_COLOR_MASK);
|
||||
@@ -2295,7 +2300,8 @@ _mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers)
|
||||
/* leave colormask, glDrawBuffer state as-is */
|
||||
|
||||
/* Clears never have the color clamped. */
|
||||
_mesa_ClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE);
|
||||
if (ctx->Extensions.ARB_color_buffer_float)
|
||||
_mesa_ClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE);
|
||||
}
|
||||
else {
|
||||
ASSERT(metaSave & MESA_META_COLOR_MASK);
|
||||
|
||||
@@ -986,7 +986,9 @@ _mesa_PopAttrib(void)
|
||||
_mesa_set_enable(ctx, GL_INDEX_LOGIC_OP,
|
||||
color->IndexLogicOpEnabled);
|
||||
_mesa_set_enable(ctx, GL_DITHER, color->DitherFlag);
|
||||
_mesa_ClampColor(GL_CLAMP_FRAGMENT_COLOR_ARB, color->ClampFragmentColor);
|
||||
if (ctx->Extensions.ARB_color_buffer_float)
|
||||
_mesa_ClampColor(GL_CLAMP_FRAGMENT_COLOR_ARB,
|
||||
color->ClampFragmentColor);
|
||||
_mesa_ClampColor(GL_CLAMP_READ_COLOR_ARB, color->ClampReadColor);
|
||||
|
||||
/* GL_ARB_framebuffer_sRGB / GL_EXT_framebuffer_sRGB */
|
||||
@@ -1114,7 +1116,10 @@ _mesa_PopAttrib(void)
|
||||
/* materials */
|
||||
memcpy(&ctx->Light.Material, &light->Material,
|
||||
sizeof(struct gl_material));
|
||||
_mesa_ClampColor(GL_CLAMP_VERTEX_COLOR_ARB, light->ClampVertexColor);
|
||||
if (ctx->Extensions.ARB_color_buffer_float) {
|
||||
_mesa_ClampColor(GL_CLAMP_VERTEX_COLOR_ARB,
|
||||
light->ClampVertexColor);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GL_LINE_BIT:
|
||||
|
||||
+16
-3
@@ -765,11 +765,19 @@ _mesa_ClampColor(GLenum target, GLenum clamp)
|
||||
|
||||
switch (target) {
|
||||
case GL_CLAMP_VERTEX_COLOR_ARB:
|
||||
if (ctx->API == API_OPENGL_CORE &&
|
||||
!ctx->Extensions.ARB_color_buffer_float) {
|
||||
goto invalid_enum;
|
||||
}
|
||||
FLUSH_VERTICES(ctx, _NEW_LIGHT);
|
||||
ctx->Light.ClampVertexColor = clamp;
|
||||
_mesa_update_clamp_vertex_color(ctx);
|
||||
break;
|
||||
case GL_CLAMP_FRAGMENT_COLOR_ARB:
|
||||
if (ctx->API == API_OPENGL_CORE &&
|
||||
!ctx->Extensions.ARB_color_buffer_float) {
|
||||
goto invalid_enum;
|
||||
}
|
||||
FLUSH_VERTICES(ctx, _NEW_FRAG_CLAMP);
|
||||
ctx->Color.ClampFragmentColor = clamp;
|
||||
_mesa_update_clamp_fragment_color(ctx);
|
||||
@@ -779,9 +787,13 @@ _mesa_ClampColor(GLenum target, GLenum clamp)
|
||||
ctx->Color.ClampReadColor = clamp;
|
||||
break;
|
||||
default:
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "glClampColorARB(target)");
|
||||
return;
|
||||
goto invalid_enum;
|
||||
}
|
||||
return;
|
||||
|
||||
invalid_enum:
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "glClampColor(%s)",
|
||||
_mesa_lookup_enum_by_nr(target));
|
||||
}
|
||||
|
||||
static GLboolean
|
||||
@@ -892,7 +904,8 @@ void _mesa_init_color( struct gl_context * ctx )
|
||||
ctx->Color.DrawBuffer[0] = GL_FRONT;
|
||||
}
|
||||
|
||||
ctx->Color.ClampFragmentColor = GL_FIXED_ONLY_ARB;
|
||||
ctx->Color.ClampFragmentColor = ctx->API == API_OPENGL_COMPAT ?
|
||||
GL_FIXED_ONLY_ARB : GL_FALSE;
|
||||
ctx->Color._ClampFragmentColor = GL_FALSE;
|
||||
ctx->Color.ClampReadColor = GL_FIXED_ONLY_ARB;
|
||||
|
||||
|
||||
+8
-1
@@ -358,6 +358,13 @@ EXTRA_EXT(ARB_texture_cube_map_array);
|
||||
EXTRA_EXT(ARB_texture_buffer_range);
|
||||
EXTRA_EXT(ARB_texture_multisample);
|
||||
|
||||
static const int
|
||||
extra_ARB_color_buffer_float_or_glcore[] = {
|
||||
EXT(ARB_color_buffer_float),
|
||||
EXTRA_API_GL_CORE,
|
||||
EXTRA_END
|
||||
};
|
||||
|
||||
static const int
|
||||
extra_NV_primitive_restart[] = {
|
||||
EXT(NV_primitive_restart),
|
||||
@@ -869,7 +876,7 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
|
||||
* \param func name of calling glGet*v() function for error reporting
|
||||
* \param d the struct value_desc that has the extra constraints
|
||||
*
|
||||
* \return GL_FALSE if one of the constraints was not satisfied,
|
||||
* \return GL_FALSE if all of the constraints were not satisfied,
|
||||
* otherwise GL_TRUE.
|
||||
*/
|
||||
static GLboolean
|
||||
|
||||
@@ -96,7 +96,7 @@ descriptor=[
|
||||
# GL_ARB_color_buffer_float
|
||||
[ "CLAMP_VERTEX_COLOR", "CONTEXT_ENUM(Light.ClampVertexColor), extra_ARB_color_buffer_float" ],
|
||||
[ "CLAMP_FRAGMENT_COLOR", "CONTEXT_ENUM(Color.ClampFragmentColor), extra_ARB_color_buffer_float" ],
|
||||
[ "CLAMP_READ_COLOR", "CONTEXT_ENUM(Color.ClampReadColor), extra_ARB_color_buffer_float" ],
|
||||
[ "CLAMP_READ_COLOR", "CONTEXT_ENUM(Color.ClampReadColor), extra_ARB_color_buffer_float_or_glcore" ],
|
||||
|
||||
# GL_ARB_copy_buffer
|
||||
[ "COPY_READ_BUFFER", "LOC_CUSTOM, TYPE_INT, 0, NO_EXTRA" ],
|
||||
|
||||
@@ -1202,7 +1202,8 @@ _mesa_init_lighting( struct gl_context *ctx )
|
||||
NULL );
|
||||
|
||||
ctx->Light.ColorMaterialEnabled = GL_FALSE;
|
||||
ctx->Light.ClampVertexColor = GL_TRUE;
|
||||
ctx->Light.ClampVertexColor = ctx->API == API_OPENGL_COMPAT;
|
||||
ctx->Light._ClampVertexColor = ctx->API == API_OPENGL_COMPAT;
|
||||
|
||||
/* Miscellaneous */
|
||||
ctx->Light._NeedEyeCoords = GL_FALSE;
|
||||
|
||||
@@ -233,7 +233,8 @@ compute_version(struct gl_context *ctx)
|
||||
const GLboolean ver_3_0 = (ver_2_1 &&
|
||||
ctx->Const.GLSLVersion >= 130 &&
|
||||
ctx->Const.MaxSamples >= 4 &&
|
||||
ctx->Extensions.ARB_color_buffer_float &&
|
||||
(ctx->API == API_OPENGL_CORE ||
|
||||
ctx->Extensions.ARB_color_buffer_float) &&
|
||||
ctx->Extensions.ARB_depth_buffer_float &&
|
||||
ctx->Extensions.ARB_half_float_pixel &&
|
||||
ctx->Extensions.ARB_half_float_vertex &&
|
||||
|
||||
Reference in New Issue
Block a user