summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2014-02-04 12:51:11 -0800
committerEric Anholt <[email protected]>2014-02-12 16:17:11 -0800
commitf29c25fc1d235d381b64f44450baf098f08e39af (patch)
tree1eea7316b1e20d1207da7924a482a8b563387db5
parent431decf16f0971534e32ec4c6c24cbce281a06f6 (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.c36
-rw-r--r--src/mesa/main/dd.h7
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);
/*@}*/