Browse Source

intel: Refactor texture_from_pixmap and EGL_image region binding.

Tested-by: Kristian Høgsberg <krh@bitplanet.net>
Acked-by: Kenneth Graunke <kenneth@whitecape.org>
tags/mesa-8.0-rc1
Eric Anholt 14 years ago
parent
commit
fdd4961443
1 changed files with 49 additions and 55 deletions
  1. 49
    55
      src/mesa/drivers/dri/intel/intel_tex_image.c

+ 49
- 55
src/mesa/drivers/dri/intel/intel_tex_image.c View File

@@ -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


Loading…
Cancel
Save