intel: Implement GL_OES_EGL_image entrypoints

This commit is contained in:
Kristian Høgsberg 2010-02-11 19:04:02 -05:00
parent c26247100b
commit 10e7962741
2 changed files with 88 additions and 0 deletions

View File

@ -200,6 +200,37 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
}
#if FEATURE_OES_EGL_image
static void
intel_image_target_renderbuffer_storage(GLcontext *ctx,
struct gl_renderbuffer *rb,
void *image_handle)
{
struct intel_context *intel = intel_context(ctx);
struct intel_renderbuffer *irb;
__DRIscreen *screen;
__DRIimage *image;
screen = intel->intelScreen->driScrnPriv;
image = screen->dri2.image->lookupEGLImage(intel->driContext, image_handle,
intel->driContext->loaderPrivate);
if (image == NULL)
return;
irb = intel_renderbuffer(rb);
if (irb->region)
intel_region_release(&irb->region);
intel_region_reference(&irb->region, image->region);
rb->Width = image->region->width;
rb->Height = image->region->height;
rb->Format = image->format;
rb->DataType = image->data_type;
rb->_BaseFormat = _mesa_base_fbo_format(&intel->ctx,
image->internal_format);
}
#endif
/**
* Called for each hardware renderbuffer when a _window_ is resized.
* Just update fields.
@ -651,4 +682,9 @@ intel_fbo_init(struct intel_context *intel)
intel->ctx.Driver.ResizeBuffers = intel_resize_buffers;
intel->ctx.Driver.ValidateFramebuffer = intel_validate_framebuffer;
intel->ctx.Driver.BlitFramebuffer = _mesa_meta_BlitFramebuffer;
#if FEATURE_OES_EGL_image
intel->ctx.Driver.EGLImageTargetRenderbufferStorage =
intel_image_target_renderbuffer_storage;
#endif
}

View File

@ -814,6 +814,54 @@ intelSetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
intelSetTexBuffer2(pDRICtx, target, __DRI_TEXTURE_FORMAT_RGBA, dPriv);
}
#if FEATURE_OES_EGL_image
static void
intel_image_target_texture_2d(GLcontext *ctx, GLenum target,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage,
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;
screen = intel->intelScreen->driScrnPriv;
image = screen->dri2.image->lookupEGLImage(intel->driContext, image_handle,
intel->driContext->loaderPrivate);
if (image == NULL)
return;
mt = intel_miptree_create_for_region(intel, target,
image->internal_format,
0, 0, image->region, 1, 0);
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);
intelImage->face = target_to_face(target);
intelImage->level = 0;
texImage->TexFormat = image->format;
texImage->RowStride = image->region->pitch;
intel_miptree_reference(&intelImage->mt, intelObj->mt);
if (!intel_miptree_match_image(intelObj->mt, &intelImage->base))
fprintf(stderr, "miptree doesn't match image\n");
}
#endif
void
intelInitTextureImageFuncs(struct dd_function_table *functions)
@ -825,4 +873,8 @@ intelInitTextureImageFuncs(struct dd_function_table *functions)
functions->CompressedTexImage2D = intelCompressedTexImage2D;
functions->GetCompressedTexImage = intelGetCompressedTexImage;
#if FEATURE_OES_EGL_image
functions->EGLImageTargetTexture2D = intel_image_target_texture_2d;
#endif
}