From 0ac9f25032a2e1bca52552972da4b55276fc1ae6 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 14 Jul 2016 14:25:19 -0600 Subject: [PATCH] mesa: add numLevels, numSamples to Driver.TestProxyTexImage() So that the function can work properly with glTexStorage(), where we know how many mipmap levels there are. And so we can compute storage for MSAA textures. Also, remove the obsolete texture border parameter. A subsequent patch will update _mesa_test_proxy_teximage() to use these new parameters. Reviewed-by: Anuj Phogat --- src/mesa/drivers/common/meta_copy_image.c | 6 +++--- src/mesa/main/dd.h | 5 +++-- src/mesa/main/teximage.c | 22 ++++++++++++---------- src/mesa/main/teximage.h | 7 ++++--- src/mesa/main/texstorage.c | 4 ++-- src/mesa/main/textureview.c | 5 +++-- src/mesa/state_tracker/st_cb_texture.c | 19 ++++++++++++------- 7 files changed, 39 insertions(+), 29 deletions(-) diff --git a/src/mesa/drivers/common/meta_copy_image.c b/src/mesa/drivers/common/meta_copy_image.c index ebea4285c9a..e1c90a372d2 100644 --- a/src/mesa/drivers/common/meta_copy_image.c +++ b/src/mesa/drivers/common/meta_copy_image.c @@ -101,9 +101,9 @@ make_view(struct gl_context *ctx, struct gl_texture_image *tex_image, 0, internal_format, GL_NONE, GL_NONE); - if (!ctx->Driver.TestProxyTexImage(ctx, tex_obj->Target, 0, tex_format, - tex_image->Width, tex_image->Height, - tex_image->Depth, 0)) { + if (!ctx->Driver.TestProxyTexImage(ctx, tex_obj->Target, 1, 0, tex_format, + 1, tex_image->Width, tex_image->Height, + tex_image->Depth)) { _mesa_DeleteTextures(1, view_tex_name); *view_tex_name = 0; return false; diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index 4891e2a3728..114cbd2b151 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -308,9 +308,10 @@ struct dd_function_table { * \return GL_TRUE if the image is OK, GL_FALSE if too large */ GLboolean (*TestProxyTexImage)(struct gl_context *ctx, GLenum target, - GLint level, mesa_format format, + GLuint numLevels, GLint level, + mesa_format format, GLuint numSamples, GLint width, GLint height, - GLint depth, GLint border); + GLint depth); /*@}*/ diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 080bcbf5509..c75f60570c2 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -1253,18 +1253,20 @@ error_check_subtexture_dimensions(struct gl_context *ctx, GLuint dims, * and texturing will effectively be disabled. * * \param target any texture target/type + * \param numLevels number of mipmap levels in the texture or 0 if not known * \param level as passed to glTexImage * \param format the MESA_FORMAT_x for the tex image + * \param numSamples number of samples per texel * \param width as passed to glTexImage * \param height as passed to glTexImage * \param depth as passed to glTexImage - * \param border as passed to glTexImage * \return GL_TRUE if the image is acceptable, GL_FALSE if not acceptable. */ GLboolean -_mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, - mesa_format format, - GLint width, GLint height, GLint depth, GLint border) +_mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, + GLuint numLevels, GLint level, + mesa_format format, GLuint numSamples, + GLint width, GLint height, GLint depth) { /* We just check if the image size is less than MaxTextureMbytes. * Some drivers may do more specific checks. @@ -2949,8 +2951,8 @@ teximage(struct gl_context *ctx, GLboolean compressed, GLuint dims, /* check that the texture won't take too much memory, etc */ sizeOK = ctx->Driver.TestProxyTexImage(ctx, proxy_target(target), - level, texFormat, - width, height, depth, border); + 0, level, texFormat, 1, + width, height, depth); if (_mesa_is_proxy_texture(target)) { /* Proxy texture: just clear or set state depending on error checking */ @@ -3646,8 +3648,8 @@ copyteximage(struct gl_context *ctx, GLuint dims, assert(texFormat != MESA_FORMAT_NONE); if (!ctx->Driver.TestProxyTexImage(ctx, proxy_target(target), - level, texFormat, - width, height, 1, border)) { + 0, level, texFormat, 1, + width, height, 1)) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage%uD(image too large)", dims); return; @@ -5386,8 +5388,8 @@ texture_image_multisample(struct gl_context *ctx, GLuint dims, dimensionsOK = _mesa_legal_texture_dimensions(ctx, target, 0, width, height, depth, 0); - sizeOK = ctx->Driver.TestProxyTexImage(ctx, target, 0, texFormat, - width, height, depth, 0); + sizeOK = ctx->Driver.TestProxyTexImage(ctx, target, 0, 0, texFormat, + samples, width, height, depth); if (_mesa_is_proxy_texture(target)) { if (samplesOK && dimensionsOK && sizeOK) { diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h index 8b687062a67..c52a7806c0d 100644 --- a/src/mesa/main/teximage.h +++ b/src/mesa/main/teximage.h @@ -176,9 +176,10 @@ _mesa_max_texture_levels(struct gl_context *ctx, GLenum target); extern GLboolean -_mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, - mesa_format format, - GLint width, GLint height, GLint depth, GLint border); +_mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, + GLuint numLevels, GLint level, + mesa_format format, GLuint numSamples, + GLint width, GLint height, GLint depth); extern GLboolean _mesa_target_can_be_compressed(const struct gl_context *ctx, GLenum target, diff --git a/src/mesa/main/texstorage.c b/src/mesa/main/texstorage.c index 72ed8696fde..ab8324f176e 100644 --- a/src/mesa/main/texstorage.c +++ b/src/mesa/main/texstorage.c @@ -396,8 +396,8 @@ _mesa_texture_storage(struct gl_context *ctx, GLuint dims, dimensionsOK = _mesa_legal_texture_dimensions(ctx, target, 0, width, height, depth, 0); - sizeOK = ctx->Driver.TestProxyTexImage(ctx, target, 0, texFormat, - width, height, depth, 0); + sizeOK = ctx->Driver.TestProxyTexImage(ctx, target, levels, 0, texFormat, + 1, width, height, depth); if (_mesa_is_proxy_texture(target)) { if (dimensionsOK && sizeOK) { diff --git a/src/mesa/main/textureview.c b/src/mesa/main/textureview.c index 9b584cdba68..ed66c179589 100644 --- a/src/mesa/main/textureview.c +++ b/src/mesa/main/textureview.c @@ -714,8 +714,9 @@ _mesa_TextureView(GLuint texture, GLenum target, GLuint origtexture, return; } - sizeOK = ctx->Driver.TestProxyTexImage(ctx, target, 0, texFormat, - width, height, depth, 0); + sizeOK = ctx->Driver.TestProxyTexImage(ctx, target, 1, 0, texFormat, + origTexImage->NumSamples, + width, height, depth); if (!sizeOK) { _mesa_error(ctx, GL_INVALID_OPERATION, "glTextureView(invalid texture size)"); diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 1474d973861..a76775f6ded 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -2686,9 +2686,9 @@ st_AllocTextureStorage(struct gl_context *ctx, static GLboolean st_TestProxyTexImage(struct gl_context *ctx, GLenum target, - GLint level, mesa_format format, - GLint width, GLint height, - GLint depth, GLint border) + GLuint numLevels, GLint level, + mesa_format format, GLuint numSamples, + GLint width, GLint height, GLint depth) { struct st_context *st = st_context(ctx); struct pipe_context *pipe = st->pipe; @@ -2710,14 +2710,19 @@ st_TestProxyTexImage(struct gl_context *ctx, GLenum target, pt.target = gl_target_to_pipe(target); pt.format = st_mesa_format_to_pipe_format(st, format); + pt.nr_samples = numSamples; st_gl_texture_dims_to_pipe_dims(target, width, height, depth, &pt.width0, &pt.height0, &pt.depth0, &pt.array_size); - if (level == 0 && (texObj->Sampler.MinFilter == GL_LINEAR || - texObj->Sampler.MinFilter == GL_NEAREST)) { + if (numLevels > 0) { + /* For immutable textures we know the final number of mip levels */ + pt.last_level = numLevels - 1; + } + else if (level == 0 && (texObj->Sampler.MinFilter == GL_LINEAR || + texObj->Sampler.MinFilter == GL_NEAREST)) { /* assume just one mipmap level */ pt.last_level = 0; } @@ -2730,8 +2735,8 @@ st_TestProxyTexImage(struct gl_context *ctx, GLenum target, } else { /* Use core Mesa fallback */ - return _mesa_test_proxy_teximage(ctx, target, level, format, - width, height, depth, border); + return _mesa_test_proxy_teximage(ctx, target, numLevels, level, format, + numSamples, width, height, depth); } } -- 2.30.2