summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2011-10-31 10:52:57 -0600
committerBrian Paul <[email protected]>2011-10-31 10:52:57 -0600
commite0a0496971dfd6c0f22b3870e6320128fa895d4d (patch)
tree4120ff445d11ccf84a7c42c4828438b569c7ee16
parent2ace9ffc8e2354acce4dc45d425d71c3f1a349b2 (diff)
st/mesa: implement GL_ARB_texture_storage
-rw-r--r--src/mesa/state_tracker/st_cb_texture.c62
-rw-r--r--src/mesa/state_tracker/st_extensions.c1
2 files changed, 63 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index f82346bc672..06c26420495 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -1842,6 +1842,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 +1939,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;
}
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index 6b9ff6b7200..f97cf369742 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -264,6 +264,7 @@ void st_init_extensions(struct st_context *st)
ctx->Extensions.ARB_texture_env_combine = GL_TRUE;
ctx->Extensions.ARB_texture_env_crossbar = GL_TRUE;
ctx->Extensions.ARB_texture_env_dot3 = GL_TRUE;
+ ctx->Extensions.ARB_texture_storage = GL_TRUE;
ctx->Extensions.ARB_vertex_array_object = GL_TRUE;
ctx->Extensions.ARB_vertex_program = GL_TRUE;
ctx->Extensions.ARB_window_pos = GL_TRUE;