From 23e81b93bbe3966a842de507988eeaa7342e12ca Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Sun, 23 Feb 2014 21:59:24 -0800 Subject: [PATCH] mesa: Add core API support for GL_ARB_stencil_texturing (from 4.3). While the GL_ARB_stencil_texturing extension does not allow the creation of stencil textures, it does allow shaders to sample stencil values stored in packed depth/stencil textures. Specifically, applications can call glTexParameter* with a pname of GL_DEPTH_STENCIL_TEXTURE_MODE and value of either GL_DEPTH_COMPONENT or GL_STENCIL_INDEX to select which component they wish to sample. The default value is GL_DEPTH_COMPONENT (for traditional depth sampling). Shaders should use an unsigned integer sampler (presumably usampler2D) to access stencil data. Otherwise, results are undefined. Using shadow samplers with GL_STENCIL_INDEX selected also is undefined behavior. This patch creates a new gl_texture_object field, StencilSampling, to indicate that stencil should be sampled rather than depth. (I chose to use a boolean since I figured it would be more convenient for drivers.) It also introduces the [Get]TexParameter code to get and set the value, and of course the extension plumbing. v2: Also consider textures incomplete when sampling stencil with non-NEAREST min/mag filters (caught by Eric Anholt). Signed-off-by: Kenneth Graunke Reviewed-by: Matt Turner Reviewed-by: Eric Anholt --- docs/GL3.txt | 2 +- src/mapi/glapi/gen/GL4x.xml | 2 +- src/mesa/main/extensions.c | 1 + src/mesa/main/mtypes.h | 2 ++ src/mesa/main/texobj.c | 2 ++ src/mesa/main/texobj.h | 14 ++++++++++++++ src/mesa/main/texparam.c | 28 ++++++++++++++++++++++++++++ 7 files changed, 49 insertions(+), 2 deletions(-) diff --git a/docs/GL3.txt b/docs/GL3.txt index 755a89c0ff9..f0e95c563e5 100644 --- a/docs/GL3.txt +++ b/docs/GL3.txt @@ -158,7 +158,7 @@ GL 4.3: GL_ARB_robust_buffer_access_behavior not started GL_ARB_shader_image_size not started GL_ARB_shader_storage_buffer_object not started - GL_ARB_stencil_texturing not started + GL_ARB_stencil_texturing API exists, no drivers GL_ARB_texture_buffer_range DONE (nv50, nvc0, i965, r600, radeonsi) GL_ARB_texture_query_levels DONE (i965) GL_ARB_texture_storage_multisample DONE (all drivers that support GL_ARB_texture_multisample) diff --git a/src/mapi/glapi/gen/GL4x.xml b/src/mapi/glapi/gen/GL4x.xml index 6706278cef8..8efef0b9159 100644 --- a/src/mapi/glapi/gen/GL4x.xml +++ b/src/mapi/glapi/gen/GL4x.xml @@ -15,7 +15,7 @@ - + diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c index c46d70b2055..a72284c9a30 100644 --- a/src/mesa/main/extensions.c +++ b/src/mesa/main/extensions.c @@ -138,6 +138,7 @@ static const struct extension extension_table[] = { { "GL_ARB_shading_language_packing", o(ARB_shading_language_packing), GL, 2011 }, { "GL_ARB_shading_language_420pack", o(ARB_shading_language_420pack), GL, 2011 }, { "GL_ARB_shadow", o(ARB_shadow), GLL, 2001 }, + { "GL_ARB_stencil_texturing", o(ARB_stencil_texturing), GL, 2012 }, { "GL_ARB_sync", o(ARB_sync), GL, 2003 }, { "GL_ARB_texture_border_clamp", o(ARB_texture_border_clamp), GLL, 2000 }, { "GL_ARB_texture_buffer_object", o(ARB_texture_buffer_object), GLC, 2008 }, diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index bbc377280b9..d05649ccc74 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1199,6 +1199,7 @@ struct gl_texture_object struct gl_sampler_object Sampler; GLenum DepthMode; /**< GL_ARB_depth_texture */ + bool StencilSampling; /**< Should we sample stencil instead of depth? */ GLfloat Priority; /**< in [0,1] */ GLint BaseLevel; /**< min mipmap level, OpenGL 1.2 */ @@ -3526,6 +3527,7 @@ struct gl_extensions GLboolean ARB_shading_language_packing; GLboolean ARB_shading_language_420pack; GLboolean ARB_shadow; + GLboolean ARB_stencil_texturing; GLboolean ARB_sync; GLboolean ARB_texture_border_clamp; GLboolean ARB_texture_buffer_object; diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index 3375fe36bc5..8bdbb08c8ea 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -148,6 +148,7 @@ _mesa_initialize_texture_object( struct gl_context *ctx, obj->Sampler.CompareMode = GL_NONE; /* ARB_shadow */ obj->Sampler.CompareFunc = GL_LEQUAL; /* ARB_shadow */ obj->DepthMode = ctx->API == API_OPENGL_CORE ? GL_RED : GL_LUMINANCE; + obj->StencilSampling = false; obj->Sampler.CubeMapSeamless = GL_FALSE; obj->Swizzle[0] = GL_RED; obj->Swizzle[1] = GL_GREEN; @@ -280,6 +281,7 @@ _mesa_copy_texture_object( struct gl_texture_object *dest, dest->Sampler.CompareFunc = src->Sampler.CompareFunc; dest->Sampler.CubeMapSeamless = src->Sampler.CubeMapSeamless; dest->DepthMode = src->DepthMode; + dest->StencilSampling = src->StencilSampling; dest->Sampler.sRGBDecode = src->Sampler.sRGBDecode; dest->_MaxLevel = src->_MaxLevel; dest->_MaxLambda = src->_MaxLambda; diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h index a4573b399e3..a9de73fff83 100644 --- a/src/mesa/main/texobj.h +++ b/src/mesa/main/texobj.h @@ -114,6 +114,20 @@ _mesa_is_texture_complete(const struct gl_texture_object *texObj, return GL_FALSE; } + /* From the ARB_stencil_texturing specification: + * "Add a new bullet point for the conditions that cause the texture + * to not be complete: + * + * * The internal format of the texture is DEPTH_STENCIL, the + * DEPTH_STENCIL_TEXTURE_MODE for the texture is STENCIL_INDEX and either + * the magnification filter or the minification filter is not NEAREST." + */ + if (texObj->StencilSampling && + texObj->Image[0][texObj->BaseLevel]->_BaseFormat == GL_DEPTH_STENCIL && + (sampler->MagFilter != GL_NEAREST || sampler->MinFilter != GL_NEAREST)) { + return GL_FALSE; + } + if (_mesa_is_mipmap_filter(sampler)) return texObj->_MipmapComplete; else diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c index e867dbf740c..bfb2e1b9f0c 100644 --- a/src/mesa/main/texparam.c +++ b/src/mesa/main/texparam.c @@ -451,6 +451,20 @@ set_tex_parameteri(struct gl_context *ctx, } goto invalid_pname; + case GL_DEPTH_STENCIL_TEXTURE_MODE: + if (_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_stencil_texturing) { + bool stencil = params[0] == GL_STENCIL_INDEX; + if (!stencil && params[0] != GL_DEPTH_COMPONENT) + goto invalid_param; + + if (texObj->StencilSampling == stencil) + return GL_FALSE; + + texObj->StencilSampling = stencil; + return GL_TRUE; + } + goto invalid_pname; + case GL_TEXTURE_CROP_RECT_OES: if (ctx->API != API_OPENGLES || !ctx->Extensions.OES_draw_texture) goto invalid_pname; @@ -707,6 +721,7 @@ _mesa_TexParameterf(GLenum target, GLenum pname, GLfloat param) case GL_TEXTURE_COMPARE_MODE_ARB: case GL_TEXTURE_COMPARE_FUNC_ARB: case GL_DEPTH_TEXTURE_MODE_ARB: + case GL_DEPTH_STENCIL_TEXTURE_MODE: case GL_TEXTURE_SRGB_DECODE_EXT: case GL_TEXTURE_CUBE_MAP_SEAMLESS: case GL_TEXTURE_SWIZZLE_R_EXT: @@ -762,6 +777,7 @@ _mesa_TexParameterfv(GLenum target, GLenum pname, const GLfloat *params) case GL_TEXTURE_COMPARE_MODE_ARB: case GL_TEXTURE_COMPARE_FUNC_ARB: case GL_DEPTH_TEXTURE_MODE_ARB: + case GL_DEPTH_STENCIL_TEXTURE_MODE: case GL_TEXTURE_SRGB_DECODE_EXT: case GL_TEXTURE_CUBE_MAP_SEAMLESS: { @@ -1459,6 +1475,12 @@ _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params ) goto invalid_pname; *params = (GLfloat) obj->DepthMode; break; + case GL_DEPTH_STENCIL_TEXTURE_MODE: + if (!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_stencil_texturing) + goto invalid_pname; + *params = (GLfloat) + (obj->StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT); + break; case GL_TEXTURE_LOD_BIAS: if (_mesa_is_gles(ctx)) goto invalid_pname; @@ -1673,6 +1695,12 @@ _mesa_GetTexParameteriv( GLenum target, GLenum pname, GLint *params ) goto invalid_pname; *params = (GLint) obj->DepthMode; break; + case GL_DEPTH_STENCIL_TEXTURE_MODE: + if (!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_stencil_texturing) + goto invalid_pname; + *params = (GLint) + (obj->StencilSampling ? GL_STENCIL_INDEX : GL_DEPTH_COMPONENT); + break; case GL_TEXTURE_LOD_BIAS: if (_mesa_is_gles(ctx)) goto invalid_pname; -- 2.30.2