From c7c5f9e16887fd10c22fbc3fd443201f0d798e12 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Tue, 7 Dec 2021 10:14:27 +0800 Subject: [PATCH] mesa: add ARB_sparse_texture texture param set/get MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Marek Olšák Signed-off-by: Qiang Yu Part-of: --- src/mesa/main/mtypes.h | 5 +++ src/mesa/main/texparam.c | 74 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index be68cb1bef2..7466625b40a 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -998,6 +998,11 @@ struct gl_texture_object /** GL_ARB_bindless_texture */ struct util_dynarray SamplerHandles; struct util_dynarray ImageHandles; + + /** GL_ARB_sparse_texture */ + GLboolean IsSparse; + GLint VirtualPageSizeIndex; + GLint NumSparseLevels; }; diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c index 63e5b072c9d..7ac49ac73c4 100644 --- a/src/mesa/main/texparam.c +++ b/src/mesa/main/texparam.c @@ -666,6 +666,40 @@ set_tex_parameteri(struct gl_context *ctx, } goto invalid_pname; + case GL_TEXTURE_SPARSE_ARB: + case GL_VIRTUAL_PAGE_SIZE_INDEX_ARB: + if (!_mesa_has_ARB_sparse_texture(ctx)) + goto invalid_pname; + + if (texObj->Immutable) + goto invalid_operation; + + if (pname == GL_TEXTURE_SPARSE_ARB) { + /* ARB_sparse_texture spec: + * + * INVALID_VALUE is generated if is TEXTURE_SPARSE_ARB, + * is TRUE and is not one of TEXTURE_2D, TEXTURE_2D_ARRAY, + * TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY, TEXTURE_3D, or + * TEXTURE_RECTANGLE. + */ + if (params[0] && + texObj->Target != GL_TEXTURE_2D && + texObj->Target != GL_TEXTURE_2D_ARRAY && + texObj->Target != GL_TEXTURE_CUBE_MAP && + texObj->Target != GL_TEXTURE_CUBE_MAP_ARRAY && + texObj->Target != GL_TEXTURE_3D && + texObj->Target != GL_TEXTURE_RECTANGLE) { + _mesa_error(ctx, GL_INVALID_VALUE, + "glTex%sParameter(target=%d)", suffix, texObj->Target); + return GL_FALSE; + } + + texObj->IsSparse = !!params[0]; + } else + texObj->VirtualPageSizeIndex = params[0]; + + return GL_TRUE; + default: goto invalid_pname; } @@ -882,6 +916,8 @@ _mesa_texture_parameterf(struct gl_context *ctx, case GL_TEXTURE_SWIZZLE_G_EXT: case GL_TEXTURE_SWIZZLE_B_EXT: case GL_TEXTURE_SWIZZLE_A_EXT: + case GL_TEXTURE_SPARSE_ARB: + case GL_VIRTUAL_PAGE_SIZE_INDEX_ARB: { GLint p[4]; p[0] = (param > 0) ? @@ -935,6 +971,8 @@ _mesa_texture_parameterfv(struct gl_context *ctx, case GL_TEXTURE_SRGB_DECODE_EXT: case GL_TEXTURE_REDUCTION_MODE_EXT: case GL_TEXTURE_CUBE_MAP_SEAMLESS: + case GL_TEXTURE_SPARSE_ARB: + case GL_VIRTUAL_PAGE_SIZE_INDEX_ARB: { /* convert float param to int */ GLint p[4]; @@ -2430,6 +2468,24 @@ get_tex_parameterfv(struct gl_context *ctx, *params = ENUM_TO_FLOAT(obj->TextureTiling); break; + case GL_TEXTURE_SPARSE_ARB: + if (!_mesa_has_ARB_sparse_texture(ctx)) + goto invalid_pname; + *params = (GLfloat) obj->IsSparse; + break; + + case GL_VIRTUAL_PAGE_SIZE_INDEX_ARB: + if (!_mesa_has_ARB_sparse_texture(ctx)) + goto invalid_pname; + *params = (GLfloat) obj->VirtualPageSizeIndex; + break; + + case GL_NUM_SPARSE_LEVELS_ARB: + if (!_mesa_has_ARB_sparse_texture(ctx)) + goto invalid_pname; + *params = (GLfloat) obj->NumSparseLevels; + break; + default: goto invalid_pname; } @@ -2702,6 +2758,24 @@ get_tex_parameteriv(struct gl_context *ctx, *params = (GLint) obj->TextureTiling; break; + case GL_TEXTURE_SPARSE_ARB: + if (!_mesa_has_ARB_sparse_texture(ctx)) + goto invalid_pname; + *params = obj->IsSparse; + break; + + case GL_VIRTUAL_PAGE_SIZE_INDEX_ARB: + if (!_mesa_has_ARB_sparse_texture(ctx)) + goto invalid_pname; + *params = obj->VirtualPageSizeIndex; + break; + + case GL_NUM_SPARSE_LEVELS_ARB: + if (!_mesa_has_ARB_sparse_texture(ctx)) + goto invalid_pname; + *params = obj->NumSparseLevels; + break; + default: goto invalid_pname; }