OSDN Git Service

st/mesa: Fix texture-from-pixmap.
authorChia-I Wu <olv@lunarg.com>
Wed, 5 May 2010 03:32:33 +0000 (11:32 +0800)
committerChia-I Wu <olv@lunarg.com>
Wed, 5 May 2010 03:58:04 +0000 (11:58 +0800)
Remember the size of the level=0 mipmap image.  Do not call
util_format_get_component_bits when st_context_teximage is called to
release a texture image.

src/mesa/state_tracker/st_cb_eglimage.c
src/mesa/state_tracker/st_manager.c

index 0fa1848..00861a6 100644 (file)
@@ -129,6 +129,10 @@ st_bind_surface(GLcontext *ctx, GLenum target,
    /* FIXME create a non-default sampler view from the pipe_surface? */
    pipe_resource_reference(&stImage->pt, ps->texture);
 
+   stObj->width0 = ps->width;
+   stObj->height0 = ps->height;
+   stObj->depth0 = 1;
+
    _mesa_dirty_texobj(ctx, texObj, GL_TRUE);
 }
 
index 44d59d4..ea89553 100644 (file)
@@ -508,6 +508,7 @@ st_context_teximage(struct st_context_iface *stctxi, enum st_texture_type target
    struct st_texture_object *stObj;
    struct st_texture_image *stImage;
    GLenum internalFormat;
+   GLuint width, height, depth;
 
    switch (target) {
    case ST_TEXTURE_1D:
@@ -527,12 +528,6 @@ st_context_teximage(struct st_context_iface *stctxi, enum st_texture_type target
       break;
    }
 
-   if (util_format_get_component_bits(internal_format,
-            UTIL_FORMAT_COLORSPACE_RGB, 3) > 0)
-      internalFormat = GL_RGBA;
-   else
-      internalFormat = GL_RGB;
-
    texObj = _mesa_select_tex_object(ctx, texUnit, target);
    _mesa_lock_texture(ctx, texObj);
 
@@ -546,17 +541,42 @@ st_context_teximage(struct st_context_iface *stctxi, enum st_texture_type target
    texImage = _mesa_get_tex_image(ctx, texObj, target, level);
    stImage = st_texture_image(texImage);
    if (tex) {
+      if (util_format_get_component_bits(internal_format,
+               UTIL_FORMAT_COLORSPACE_RGB, 3) > 0)
+         internalFormat = GL_RGBA;
+      else
+         internalFormat = GL_RGB;
+
       _mesa_init_teximage_fields(ctx, target, texImage,
             tex->width0, tex->height0, 1, 0, internalFormat);
       texImage->TexFormat = st_ChooseTextureFormat(ctx, internalFormat,
             GL_RGBA, GL_UNSIGNED_BYTE);
       _mesa_set_fetch_functions(texImage, 2);
+
+      width = tex->width0;
+      height = tex->height0;
+      depth = tex->depth0;
+
+      /* grow the image size until we hit level = 0 */
+      while (level > 0) {
+         if (width != 1)
+            width <<= 1;
+         if (height != 1)
+            height <<= 1;
+         if (depth != 1)
+            depth <<= 1;
+         level--;
+      }
    }
    else {
       _mesa_clear_texture_image(ctx, texImage);
+      width = height = depth = 0;
    }
 
    pipe_resource_reference(&stImage->pt, tex);
+   stObj->width0 = width;
+   stObj->height0 = height;
+   stObj->depth0 = depth;
 
    _mesa_dirty_texobj(ctx, texObj, GL_TRUE);
    _mesa_unlock_texture(ctx, texObj);