diff options
author | Ian Romanick <[email protected]> | 2012-07-27 11:03:06 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2012-08-29 15:09:34 -0700 |
commit | bca2cece02385a14f61d5dd8d31aba775b0afb8e (patch) | |
tree | 11bb9f04eba87f7f4456bdc8ac49f8766de4e954 /src/mesa | |
parent | 2c87030a00eb5b7034f14f6060093d4b264bc5c0 (diff) |
mesa/es: Validate glHint target in Mesa code rather than the ES wrapper
v2: Add proper core-profile and GLES3 filtering.
Signed-off-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/main/APIspec.xml | 13 | ||||
-rw-r--r-- | src/mesa/main/hint.c | 31 |
2 files changed, 25 insertions, 19 deletions
diff --git a/src/mesa/main/APIspec.xml b/src/mesa/main/APIspec.xml index 6b20baa38df..bfd56137b8c 100644 --- a/src/mesa/main/APIspec.xml +++ b/src/mesa/main/APIspec.xml @@ -96,19 +96,6 @@ <param name="target" type="GLenum"/> <param name="mode" type="GLenum"/> </proto> - - <desc name="target" category="GLES1.1"> - <value name="GL_FOG_HINT"/> - <value name="GL_LINE_SMOOTH_HINT"/> - <value name="GL_PERSPECTIVE_CORRECTION_HINT"/> - <value name="GL_POINT_SMOOTH_HINT"/> - </desc> - <desc name="target" category="OES_standard_derivatives"> - <value name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES"/> - </desc> - <desc name="target"> - <value name="GL_GENERATE_MIPMAP_HINT"/> - </desc> </template> <template name="Light"> diff --git a/src/mesa/main/hint.c b/src/mesa/main/hint.c index ff8d88fffe0..90130e3dbbb 100644 --- a/src/mesa/main/hint.c +++ b/src/mesa/main/hint.c @@ -51,30 +51,40 @@ _mesa_Hint( GLenum target, GLenum mode ) switch (target) { case GL_FOG_HINT: + if (ctx->API != API_OPENGL && ctx->API != API_OPENGLES) + goto invalid_target; if (ctx->Hint.Fog == mode) return; FLUSH_VERTICES(ctx, _NEW_HINT); ctx->Hint.Fog = mode; break; case GL_LINE_SMOOTH_HINT: + if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES) + goto invalid_target; if (ctx->Hint.LineSmooth == mode) return; FLUSH_VERTICES(ctx, _NEW_HINT); ctx->Hint.LineSmooth = mode; break; case GL_PERSPECTIVE_CORRECTION_HINT: + if (ctx->API != API_OPENGL && ctx->API != API_OPENGLES) + goto invalid_target; if (ctx->Hint.PerspectiveCorrection == mode) return; FLUSH_VERTICES(ctx, _NEW_HINT); ctx->Hint.PerspectiveCorrection = mode; break; case GL_POINT_SMOOTH_HINT: + if (ctx->API != API_OPENGL && ctx->API != API_OPENGLES) + goto invalid_target; if (ctx->Hint.PointSmooth == mode) return; FLUSH_VERTICES(ctx, _NEW_HINT); ctx->Hint.PointSmooth = mode; break; case GL_POLYGON_SMOOTH_HINT: + if (!_mesa_is_desktop_gl(ctx)) + goto invalid_target; if (ctx->Hint.PolygonSmooth == mode) return; FLUSH_VERTICES(ctx, _NEW_HINT); @@ -83,6 +93,8 @@ _mesa_Hint( GLenum target, GLenum mode ) /* GL_EXT_clip_volume_hint */ case GL_CLIP_VOLUME_CLIPPING_HINT_EXT: + if (ctx->API != API_OPENGL) + goto invalid_target; if (ctx->Hint.ClipVolumeClipping == mode) return; FLUSH_VERTICES(ctx, _NEW_HINT); @@ -91,6 +103,8 @@ _mesa_Hint( GLenum target, GLenum mode ) /* GL_ARB_texture_compression */ case GL_TEXTURE_COMPRESSION_HINT_ARB: + if (!_mesa_is_desktop_gl(ctx)) + goto invalid_target; if (ctx->Hint.TextureCompression == mode) return; FLUSH_VERTICES(ctx, _NEW_HINT); @@ -99,6 +113,8 @@ _mesa_Hint( GLenum target, GLenum mode ) /* GL_SGIS_generate_mipmap */ case GL_GENERATE_MIPMAP_HINT_SGIS: + if (ctx->API == API_OPENGL_CORE) + goto invalid_target; if (ctx->Hint.GenerateMipmap == mode) return; FLUSH_VERTICES(ctx, _NEW_HINT); @@ -107,10 +123,8 @@ _mesa_Hint( GLenum target, GLenum mode ) /* GL_ARB_fragment_shader */ case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB: - if (!ctx->Extensions.ARB_fragment_shader) { - _mesa_error(ctx, GL_INVALID_ENUM, "glHint(target)"); - return; - } + if (ctx->API == API_OPENGLES || !ctx->Extensions.ARB_fragment_shader) + goto invalid_target; if (ctx->Hint.FragmentShaderDerivative == mode) return; FLUSH_VERTICES(ctx, _NEW_HINT); @@ -118,13 +132,18 @@ _mesa_Hint( GLenum target, GLenum mode ) break; default: - _mesa_error(ctx, GL_INVALID_ENUM, "glHint(target)"); - return; + goto invalid_target; } if (ctx->Driver.Hint) { (*ctx->Driver.Hint)( ctx, target, mode ); } + + return; + +invalid_target: + _mesa_error(ctx, GL_INVALID_ENUM, "glHint(target)"); + return; } |