diff --git a/src/mesa/main/formatquery.c b/src/mesa/main/formatquery.c index 3c2d6d4708f..f95086b4415 100644 --- a/src/mesa/main/formatquery.c +++ b/src/mesa/main/formatquery.c @@ -143,6 +143,18 @@ _legal_parameters(struct gl_context *ctx, GLenum target, GLenum internalformat, } break; + case GL_NUM_VIRTUAL_PAGE_SIZES_ARB: + case GL_VIRTUAL_PAGE_SIZE_X_ARB: + case GL_VIRTUAL_PAGE_SIZE_Y_ARB: + case GL_VIRTUAL_PAGE_SIZE_Z_ARB: + if (!_mesa_has_ARB_sparse_texture(ctx)) { + _mesa_error(ctx, GL_INVALID_ENUM, + "glGetInternalformativ(pname=%s)", + _mesa_enum_to_string(pname)); + return false; + } + break; + case GL_SRGB_DECODE_ARB: /* The ARB_internalformat_query2 spec says: * @@ -325,6 +337,10 @@ _set_default_response(GLenum pname, GLint buffer[16]) case GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT: case GL_TEXTURE_COMPRESSED_BLOCK_SIZE: case GL_NUM_TILING_TYPES_EXT: + case GL_NUM_VIRTUAL_PAGE_SIZES_ARB: + case GL_VIRTUAL_PAGE_SIZE_X_ARB: + case GL_VIRTUAL_PAGE_SIZE_Y_ARB: + case GL_VIRTUAL_PAGE_SIZE_Z_ARB: buffer[0] = 0; break; @@ -1574,6 +1590,13 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, buffer[0] = (GLint)0; break; + case GL_NUM_VIRTUAL_PAGE_SIZES_ARB: + case GL_VIRTUAL_PAGE_SIZE_X_ARB: + case GL_VIRTUAL_PAGE_SIZE_Y_ARB: + case GL_VIRTUAL_PAGE_SIZE_Z_ARB: + st_QueryInternalFormat(ctx, target, internalformat, pname, buffer); + break; + default: unreachable("bad param"); } diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c index fe399561ceb..1905d1f7515 100644 --- a/src/mesa/state_tracker/st_format.c +++ b/src/mesa/state_tracker/st_format.c @@ -1510,6 +1510,31 @@ st_QueryInternalFormat(struct gl_context *ctx, GLenum target, 0, 0, PIPE_BIND_SAMPLER_REDUCTION_MINMAX); break; } + case GL_NUM_VIRTUAL_PAGE_SIZES_ARB: + case GL_VIRTUAL_PAGE_SIZE_X_ARB: + case GL_VIRTUAL_PAGE_SIZE_Y_ARB: + case GL_VIRTUAL_PAGE_SIZE_Z_ARB: { + mesa_format format = st_ChooseTextureFormat(ctx, target, internalFormat, GL_NONE, GL_NONE); + enum pipe_format pformat = st_mesa_format_to_pipe_format(st, format); + + if (pformat != PIPE_FORMAT_NONE) { + struct pipe_screen *screen = st->screen; + enum pipe_texture_target ptarget = gl_target_to_pipe(target); + + if (pname == GL_NUM_VIRTUAL_PAGE_SIZES_ARB) + params[0] = screen->get_sparse_texture_virtual_page_size( + screen, ptarget, pformat, 0, 0, NULL, NULL, NULL); + else { + int *args[3] = {0}; + args[pname - GL_VIRTUAL_PAGE_SIZE_X_ARB] = params; + + /* 16 comes from the caller _mesa_GetInternalformativ() */ + screen->get_sparse_texture_virtual_page_size( + screen, ptarget, pformat, 0, 16, args[0], args[1], args[2]); + } + } + break; + } default: /* For the rest of the pnames, we call back the Mesa's default * function for drivers that don't implement ARB_internalformat_query2.