diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_fbo.c | 36 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_tex_image.c | 52 | 
2 files changed, 88 insertions, 0 deletions
| diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c index e154bd4087..82c7b19eef 100644 --- a/src/mesa/drivers/dri/intel/intel_fbo.c +++ b/src/mesa/drivers/dri/intel/intel_fbo.c @@ -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     } diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c index aefd0b97d0..f586aee992 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_image.c +++ b/src/mesa/drivers/dri/intel/intel_tex_image.c @@ -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  } | 
