From ead8847d4482d2690602cbfcef00c86c392d9934 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Sun, 16 Sep 2012 19:42:15 -0600 Subject: [PATCH] st/mesa: implement new proxy texture code If the gallium driver implements the can_create_resource() function, call it to do proxy texture size checks. Reviewed-by: Jose Fonseca --- src/mesa/state_tracker/st_cb_texture.c | 61 +++++++++++++++++++++++++++++++++- src/mesa/state_tracker/st_texture.c | 13 ++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 518b680..4f4fe77 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -73,19 +73,32 @@ gl_target_to_pipe(GLenum target) { switch (target) { case GL_TEXTURE_1D: + case GL_PROXY_TEXTURE_1D: return PIPE_TEXTURE_1D; case GL_TEXTURE_2D: + case GL_PROXY_TEXTURE_2D: case GL_TEXTURE_EXTERNAL_OES: return PIPE_TEXTURE_2D; case GL_TEXTURE_RECTANGLE_NV: + case GL_PROXY_TEXTURE_RECTANGLE_NV: return PIPE_TEXTURE_RECT; case GL_TEXTURE_3D: + case GL_PROXY_TEXTURE_3D: return PIPE_TEXTURE_3D; case GL_TEXTURE_CUBE_MAP_ARB: + case GL_PROXY_TEXTURE_CUBE_MAP_ARB: + case GL_TEXTURE_CUBE_MAP_POSITIVE_X: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: + case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: + case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: return PIPE_TEXTURE_CUBE; case GL_TEXTURE_1D_ARRAY_EXT: + case GL_PROXY_TEXTURE_1D_ARRAY_EXT: return PIPE_TEXTURE_1D_ARRAY; case GL_TEXTURE_2D_ARRAY_EXT: + case GL_PROXY_TEXTURE_2D_ARRAY_EXT: return PIPE_TEXTURE_2D_ARRAY; case GL_TEXTURE_BUFFER: return PIPE_BUFFER; @@ -1357,6 +1370,52 @@ st_AllocTextureStorage(struct gl_context *ctx, } +static GLboolean +st_TestProxyTexImage(struct gl_context *ctx, GLenum target, + GLint level, gl_format format, + GLint width, GLint height, + GLint depth, GLint border) +{ + struct st_context *st = st_context(ctx); + struct pipe_context *pipe = st->pipe; + + if (pipe->screen->can_create_resource) { + /* Ask the gallium driver if the texture is too large */ + struct gl_texture_object *texObj = + _mesa_get_current_tex_object(ctx, target); + struct pipe_resource pt; + + /* Setup the pipe_resource object + */ + memset(&pt, 0, sizeof(pt)); + + pt.target = gl_target_to_pipe(target); + pt.format = st_mesa_format_to_pipe_format(format); + + 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)) { + /* assume just one mipmap level */ + pt.last_level = 0; + } + else { + /* assume a full set of mipmaps */ + pt.last_level = _mesa_logbase2(MAX3(width, height, depth)); + } + + return pipe->screen->can_create_resource(pipe->screen, &pt); + } + else { + /* Use core Mesa fallback */ + return _mesa_test_proxy_teximage(ctx, target, level, format, + width, height, depth, border); + } +} + void st_init_texture_functions(struct dd_function_table *functions) @@ -1384,7 +1443,7 @@ st_init_texture_functions(struct dd_function_table *functions) functions->UnmapTextureImage = st_UnmapTextureImage; /* XXX Temporary until we can query pipe's texture sizes */ - functions->TestProxyTexImage = _mesa_test_proxy_teximage; + functions->TestProxyTexImage = st_TestProxyTexImage; functions->AllocTextureStorage = st_AllocTextureStorage; } diff --git a/src/mesa/state_tracker/st_texture.c b/src/mesa/state_tracker/st_texture.c index 9627a61..3670683 100644 --- a/src/mesa/state_tracker/st_texture.c +++ b/src/mesa/state_tracker/st_texture.c @@ -117,6 +117,7 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture, { switch (texture) { case GL_TEXTURE_1D: + case GL_PROXY_TEXTURE_1D: assert(heightIn == 1); assert(depthIn == 1); *widthOut = widthIn; @@ -125,6 +126,7 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture, *layersOut = 1; break; case GL_TEXTURE_1D_ARRAY: + case GL_PROXY_TEXTURE_1D_ARRAY: assert(depthIn == 1); *widthOut = widthIn; *heightOut = 1; @@ -132,7 +134,9 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture, *layersOut = heightIn; break; case GL_TEXTURE_2D: + case GL_PROXY_TEXTURE_2D: case GL_TEXTURE_RECTANGLE: + case GL_PROXY_TEXTURE_RECTANGLE: case GL_TEXTURE_EXTERNAL_OES: assert(depthIn == 1); *widthOut = widthIn; @@ -141,6 +145,13 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture, *layersOut = 1; break; case GL_TEXTURE_CUBE_MAP: + case GL_PROXY_TEXTURE_CUBE_MAP: + case GL_TEXTURE_CUBE_MAP_POSITIVE_X: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: + case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: + case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: assert(depthIn == 1); *widthOut = widthIn; *heightOut = heightIn; @@ -148,6 +159,7 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture, *layersOut = 6; break; case GL_TEXTURE_2D_ARRAY: + case GL_PROXY_TEXTURE_2D_ARRAY: *widthOut = widthIn; *heightOut = heightIn; *depthOut = 1; @@ -157,6 +169,7 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture, assert(0 && "Unexpected texture in st_gl_texture_dims_to_pipe_dims()"); /* fall-through */ case GL_TEXTURE_3D: + case GL_PROXY_TEXTURE_3D: *widthOut = widthIn; *heightOut = heightIn; *depthOut = depthIn; -- 2.7.4