diff options
Diffstat (limited to 'mesalib/src/mesa/state_tracker/st_cb_texture.c')
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_cb_texture.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/mesalib/src/mesa/state_tracker/st_cb_texture.c b/mesalib/src/mesa/state_tracker/st_cb_texture.c index f82346bc6..c58a9df56 100644 --- a/mesalib/src/mesa/state_tracker/st_cb_texture.c +++ b/mesalib/src/mesa/state_tracker/st_cb_texture.c @@ -75,6 +75,7 @@ gl_target_to_pipe(GLenum target) case GL_TEXTURE_1D: return PIPE_TEXTURE_1D; case GL_TEXTURE_2D: + case GL_TEXTURE_EXTERNAL_OES: return PIPE_TEXTURE_2D; case GL_TEXTURE_RECTANGLE_NV: return PIPE_TEXTURE_RECT; @@ -310,6 +311,7 @@ get_texture_dims(GLenum target) case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: case GL_TEXTURE_RECTANGLE_NV: case GL_TEXTURE_2D_ARRAY_EXT: + case GL_TEXTURE_EXTERNAL_OES: return 2; case GL_TEXTURE_3D: return 3; @@ -1842,6 +1844,66 @@ st_get_default_texture(struct st_context *st) } +/** + * Called via ctx->Driver.AllocTextureStorage() to allocate texture memory + * for a whole mipmap stack. + */ +static GLboolean +st_AllocTextureStorage(struct gl_context *ctx, + struct gl_texture_object *texObj, + GLsizei levels, GLsizei width, + GLsizei height, GLsizei depth) +{ + const GLuint numFaces = (texObj->Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; + struct st_context *st = st_context(ctx); + struct st_texture_object *stObj = st_texture_object(texObj); + GLuint ptWidth, ptHeight, ptDepth, ptLayers, bindings; + enum pipe_format fmt; + GLint level; + + assert(levels > 0); + + /* Save the level=0 dimensions */ + stObj->width0 = width; + stObj->height0 = height; + stObj->depth0 = depth; + stObj->lastLevel = levels - 1; + + fmt = st_mesa_format_to_pipe_format(texObj->Image[0][0]->TexFormat); + + bindings = default_bindings(st, fmt); + + st_gl_texture_dims_to_pipe_dims(texObj->Target, + width, height, depth, + &ptWidth, &ptHeight, &ptDepth, &ptLayers); + + stObj->pt = st_texture_create(st, + gl_target_to_pipe(texObj->Target), + fmt, + levels, + ptWidth, + ptHeight, + ptDepth, + ptLayers, + bindings); + if (!stObj->pt) + return GL_FALSE; + + /* Set image resource pointers */ + for (level = 0; level < levels; level++) { + GLuint face; + for (face = 0; face < numFaces; face++) { + struct st_texture_image *stImage = + st_texture_image(texObj->Image[face][level]); + pipe_resource_reference(&stImage->pt, stObj->pt); + } + } + + return GL_TRUE; +} + + + void st_init_texture_functions(struct dd_function_table *functions) { @@ -1879,4 +1941,6 @@ st_init_texture_functions(struct dd_function_table *functions) /* XXX Temporary until we can query pipe's texture sizes */ functions->TestProxyTexImage = _mesa_test_proxy_teximage; + + functions->AllocTextureStorage = st_AllocTextureStorage; } |