summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2011-09-21 15:13:57 -0700
committerEric Anholt <[email protected]>2011-09-26 15:33:42 -0700
commitfdd4961443d0fbb968c07f5b693c45785ae416f5 (patch)
treefd49535248b7aa191546da36aa836633eba8ae96
parent19cfe1e035fdaf03b7a3560c47f1b8d59a221902 (diff)
intel: Refactor texture_from_pixmap and EGL_image region binding.
Tested-by: Kristian Høgsberg <[email protected]> Acked-by: Kenneth Graunke <[email protected]>
-rw-r--r--src/mesa/drivers/dri/intel/intel_tex_image.c104
1 files changed, 49 insertions, 55 deletions
diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c
index 8fd69c3734a..15196c0ebcc 100644
--- a/src/mesa/drivers/dri/intel/intel_tex_image.c
+++ b/src/mesa/drivers/dri/intel/intel_tex_image.c
@@ -664,6 +664,50 @@ intelGetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level,
texObj, texImage, GL_TRUE);
}
+/**
+ * Binds a region to a texture image, like it was uploaded by glTexImage2D().
+ *
+ * Used for GLX_EXT_texture_from_pixmap and EGL image extensions,
+ */
+static void
+intel_set_texture_image_region(struct gl_context *ctx,
+ struct gl_texture_image *image,
+ struct intel_region *region,
+ GLenum target,
+ GLenum internalFormat,
+ gl_format format)
+{
+ struct intel_context *intel = intel_context(ctx);
+ struct intel_texture_image *intel_image = intel_texture_image(image);
+ struct gl_texture_object *texobj = image->TexObject;
+ struct intel_texture_object *intel_texobj = intel_texture_object(texobj);
+
+ _mesa_init_teximage_fields(&intel->ctx, target, image,
+ region->width, region->height, 1,
+ 0, internalFormat, format);
+
+ if (intel_image->mt) {
+ intel_miptree_release(intel, &intel_image->mt);
+ assert(!image->Data);
+ }
+
+ intel_image->mt = intel_miptree_create_for_region(intel, target,
+ image->TexFormat,
+ region);
+ if (intel_image->mt == NULL)
+ return;
+
+ image->RowStride = region->pitch;
+
+ /* Immediately validate the image to the object. */
+ if (intel_texobj->mt)
+ intel_miptree_release(intel, &intel_texobj->mt);
+ intel_miptree_reference(&intel_texobj->mt, intel_image->mt);
+
+ if (!intel_miptree_match_image(intel_texobj->mt, &intel_image->base.Base))
+ fprintf(stderr, "miptree doesn't match image\n");
+}
+
void
intelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
GLint texture_format,
@@ -673,8 +717,6 @@ intelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
struct intel_context *intel = pDRICtx->driverPrivate;
struct gl_context *ctx = &intel->ctx;
struct intel_texture_object *intelObj;
- struct intel_texture_image *intelImage;
- struct intel_mipmap_tree *mt;
struct intel_renderbuffer *rb;
struct gl_texture_object *texObj;
struct gl_texture_image *texImage;
@@ -707,35 +749,10 @@ intelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
texFormat = MESA_FORMAT_ARGB8888;
}
- mt = intel_miptree_create_for_region(intel, target, texFormat, rb->region);
- if (mt == NULL)
- return;
-
_mesa_lock_texture(&intel->ctx, texObj);
-
- texImage = _mesa_get_tex_image(&intel->ctx, texObj, target, level);
- intelImage = intel_texture_image(texImage);
-
- if (intelImage->mt) {
- intel_miptree_release(intel, &intelImage->mt);
- assert(!texImage->Data);
- }
- if (intelObj->mt)
- intel_miptree_release(intel, &intelObj->mt);
-
- intelObj->mt = mt;
-
- _mesa_init_teximage_fields(&intel->ctx, target, texImage,
- rb->region->width, rb->region->height, 1,
- 0, internalFormat, texFormat);
-
- texImage->RowStride = rb->region->pitch;
- intel_miptree_reference(&intelImage->mt, intelObj->mt);
-
- if (!intel_miptree_match_image(intelObj->mt, &intelImage->base.Base)) {
- fprintf(stderr, "miptree doesn't match image\n");
- }
-
+ texImage = _mesa_get_tex_image(ctx, texObj, target, level);
+ intel_set_texture_image_region(ctx, texImage, rb->region, target,
+ internalFormat, texFormat);
_mesa_unlock_texture(&intel->ctx, texObj);
}
@@ -756,9 +773,6 @@ intel_image_target_texture_2d(struct gl_context *ctx, GLenum target,
GLeglImageOES image_handle)
{
struct intel_context *intel = intel_context(ctx);
- struct intel_texture_object *intelObj = intel_texture_object(texObj);
- struct intel_texture_image *intelImage = intel_texture_image(texImage);
- struct intel_mipmap_tree *mt;
__DRIscreen *screen;
__DRIimage *image;
@@ -768,28 +782,8 @@ intel_image_target_texture_2d(struct gl_context *ctx, GLenum target,
if (image == NULL)
return;
- mt = intel_miptree_create_for_region(intel, target, image->format,
- image->region);
- if (mt == NULL)
- return;
-
- if (intelImage->mt) {
- intel_miptree_release(intel, &intelImage->mt);
- assert(!texImage->Data);
- }
- if (intelObj->mt)
- intel_miptree_release(intel, &intelObj->mt);
-
- intelObj->mt = mt;
- _mesa_init_teximage_fields(&intel->ctx, target, texImage,
- image->region->width, image->region->height, 1,
- 0, image->internal_format, image->format);
-
- texImage->RowStride = image->region->pitch;
- intel_miptree_reference(&intelImage->mt, intelObj->mt);
-
- if (!intel_miptree_match_image(intelObj->mt, &intelImage->base.Base))
- fprintf(stderr, "miptree doesn't match image\n");
+ intel_set_texture_image_region(ctx, texImage, image->region,
+ target, image->internal_format, image->format);
}
#endif