diff options
author | Eric Anholt <[email protected]> | 2014-02-04 12:51:11 -0800 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2014-02-12 16:17:11 -0800 |
commit | f29c25fc1d235d381b64f44450baf098f08e39af (patch) | |
tree | 1eea7316b1e20d1207da7924a482a8b563387db5 | |
parent | 431decf16f0971534e32ec4c6c24cbce281a06f6 (diff) |
i965: Add a driver hook for binding renderbuffers to textures.
This will let us use meta's acceleration from renderbuffers without having
to do a CopyTexImage first.
This is like what we do for TFP, but just taking an existing renderbuffer
and binding it to a texture with whatever its format was. The
implementation won't work for stencil renderbuffers, and it only does
non-texture renderbuffers (but then, if you're using a texture
renderbuffer, you can just pull the texture object/level/slice out of the
renderbuffer, anyway).
v2: Don't forget to propagate NumSamples to the teximage.
Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_tex_image.c | 36 | ||||
-rw-r--r-- | src/mesa/main/dd.h | 7 |
2 files changed, 43 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c b/src/mesa/drivers/dri/i965/intel_tex_image.c index 02b3ba5a569..ee02e689782 100644 --- a/src/mesa/drivers/dri/i965/intel_tex_image.c +++ b/src/mesa/drivers/dri/i965/intel_tex_image.c @@ -322,6 +322,41 @@ intelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target, _mesa_unlock_texture(&brw->ctx, texObj); } +static GLboolean +intel_bind_renderbuffer_tex_image(struct gl_context *ctx, + struct gl_renderbuffer *rb, + struct gl_texture_image *image) +{ + struct intel_renderbuffer *irb = intel_renderbuffer(rb); + 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); + + /* We can only handle RB allocated with AllocRenderbufferStorage, or + * window-system renderbuffers. + */ + assert(!rb->TexImage); + + if (!irb->mt) + return false; + + _mesa_lock_texture(ctx, texobj); + _mesa_init_teximage_fields(ctx, image, + rb->Width, rb->Height, 1, + 0, rb->InternalFormat, rb->Format); + image->NumSamples = rb->NumSamples; + + intel_miptree_reference(&intel_image->mt, irb->mt); + + /* Immediately validate the image to the object. */ + intel_miptree_reference(&intel_texobj->mt, intel_image->mt); + + intel_texobj->needs_validate = true; + _mesa_unlock_texture(ctx, texobj); + + return true; +} + void intelSetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv) { @@ -385,4 +420,5 @@ intelInitTextureImageFuncs(struct dd_function_table *functions) { functions->TexImage = intelTexImage; functions->EGLImageTargetTexture2D = intel_image_target_texture_2d; + functions->BindRenderbufferTexImage = intel_bind_renderbuffer_tex_image; } diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index ac317e39950..ccd44948860 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -399,6 +399,13 @@ struct dd_function_table { void (*UnmapRenderbuffer)(struct gl_context *ctx, struct gl_renderbuffer *rb); + /** + * Optional driver entrypoint that binds a non-texture renderbuffer's + * contents to a texture image. + */ + GLboolean (*BindRenderbufferTexImage)(struct gl_context *ctx, + struct gl_renderbuffer *rb, + struct gl_texture_image *texImage); /*@}*/ |