mesa: add ARB_sparse_texture query in glGetInternalformativ

Add new parameter of glGetInternalformativ for ARB_sparse_texture.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14223>
This commit is contained in:
Qiang Yu 2021-12-06 17:45:59 +08:00
parent 1a616c4b29
commit b1c32a6c8c
2 changed files with 48 additions and 0 deletions

View File

@ -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");
}

View File

@ -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.