diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 0adb80c6a07..f0ce216646f 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -6867,6 +6867,11 @@ texture_image_multisample(struct gl_context *ctx, GLuint dims, return; } + if (texObj->IsSparse && + _mesa_sparse_texture_error_check(ctx, dims, texObj, texFormat, target, 0, + width, height, depth, func)) + return; /* error was recorded */ + st_FreeTextureImageBuffer(ctx, texImage); _mesa_init_teximage_fields_ms(ctx, texImage, width, height, depth, 0, diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h index 95f53be01c2..da8721ddc81 100644 --- a/src/mesa/main/teximage.h +++ b/src/mesa/main/teximage.h @@ -250,6 +250,13 @@ _mesa_texture_storage_ms_memory(struct gl_context *ctx, GLuint dims, bool _mesa_is_cube_map_texture(GLenum target); +GLboolean +_mesa_sparse_texture_error_check(struct gl_context *ctx, GLuint dims, + struct gl_texture_object *texObj, + mesa_format format, GLenum target, GLsizei levels, + GLsizei width, GLsizei height, GLsizei depth, + const char *func); + /*@}*/ #ifdef __cplusplus diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c index 5f8478048f5..c2514c68448 100644 --- a/src/mesa/main/texparam.c +++ b/src/mesa/main/texparam.c @@ -681,6 +681,9 @@ set_tex_parameteri(struct gl_context *ctx, * is TRUE and is not one of TEXTURE_2D, TEXTURE_2D_ARRAY, * TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY, TEXTURE_3D, or * TEXTURE_RECTANGLE. + * + * ARB_sparse_texture2 also allow TEXTURE_2D_MULTISAMPLE and + * TEXTURE_2D_MULTISAMPLE_ARRAY. */ if (params[0] && texObj->Target != GL_TEXTURE_2D && @@ -688,7 +691,10 @@ set_tex_parameteri(struct gl_context *ctx, texObj->Target != GL_TEXTURE_CUBE_MAP && texObj->Target != GL_TEXTURE_CUBE_MAP_ARRAY && texObj->Target != GL_TEXTURE_3D && - texObj->Target != GL_TEXTURE_RECTANGLE) { + texObj->Target != GL_TEXTURE_RECTANGLE && + (!_mesa_has_ARB_sparse_texture2(ctx) || + (texObj->Target != GL_TEXTURE_2D_MULTISAMPLE && + texObj->Target != GL_TEXTURE_2D_MULTISAMPLE_ARRAY))) { _mesa_error(ctx, GL_INVALID_VALUE, "glTex%sParameter(target=%d)", suffix, texObj->Target); return GL_FALSE; diff --git a/src/mesa/main/texstorage.c b/src/mesa/main/texstorage.c index da70da97a22..166e68ea45f 100644 --- a/src/mesa/main/texstorage.c +++ b/src/mesa/main/texstorage.c @@ -349,21 +349,19 @@ tex_storage_error_check(struct gl_context *ctx, return GL_FALSE; } -static GLboolean -sparse_texture_error_check(struct gl_context *ctx, GLuint dims, - struct gl_texture_object *texObj, - mesa_format format, GLenum target, GLsizei levels, - GLsizei width, GLsizei height, GLsizei depth, - bool dsa) +GLboolean +_mesa_sparse_texture_error_check(struct gl_context *ctx, GLuint dims, + struct gl_texture_object *texObj, + mesa_format format, GLenum target, GLsizei levels, + GLsizei width, GLsizei height, GLsizei depth, + const char *func) { - const char* suffix = dsa ? "ture" : ""; - int px, py, pz; int index = texObj->VirtualPageSizeIndex; if (!st_GetSparseTextureVirtualPageSize(ctx, target, format, index, &px, &py, &pz)) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glTex%sStorage%uD(sparse index = %d)", - suffix, dims, index); + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(sparse index = %d)", + func, index); return GL_TRUE; } @@ -390,8 +388,7 @@ sparse_texture_error_check(struct gl_context *ctx, GLuint dims, /* ARB_sparse_texture2 allow non-page-aligned base texture size. */ if (!_mesa_has_ARB_sparse_texture2(ctx) && (width % px || height % py || depth % pz)) { - _mesa_error(ctx, GL_INVALID_VALUE, "glTex%sStorage%uD(sparse page size)", - suffix, dims); + _mesa_error(ctx, GL_INVALID_VALUE, "%s(sparse page size)", func); return GL_TRUE; } @@ -420,16 +417,14 @@ sparse_texture_error_check(struct gl_context *ctx, GLuint dims, target == GL_TEXTURE_CUBE_MAP_ARRAY) && (width % (px << (levels - 1)) || height % (py << (levels - 1)))) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glTex%sStorage%uD(sparse array align)", - suffix, dims); + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(sparse array align)", func); return GL_TRUE; } return GL_FALSE; exceed_max_size: - _mesa_error(ctx, GL_INVALID_VALUE, "glTex%sStorage%uD(exceed max sparse size)", - suffix, dims); + _mesa_error(ctx, GL_INVALID_VALUE, "%s(exceed max sparse size)", func); return GL_TRUE; } @@ -497,10 +492,13 @@ texture_storage(struct gl_context *ctx, GLuint dims, return; } - if (texObj->IsSparse && - sparse_texture_error_check(ctx, dims, texObj, texFormat, target, levels, - width, height, depth, dsa)) - return; /* error was recorded */ + if (texObj->IsSparse) { + char func[32]; + snprintf(func, 32, "glTex%sStorage%uD", suffix, dims); + if (_mesa_sparse_texture_error_check(ctx, dims, texObj, texFormat, target, + levels, width, height, depth, func)) + return; /* error was recorded */ + } } assert(levels > 0);