st/mesa: add fake ARB_copy_image support in Gallium
authorIlia Mirkin <imirkin@alum.mit.edu>
Mon, 20 Jul 2015 19:19:53 +0000 (15:19 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Wed, 19 Aug 2015 06:35:38 +0000 (02:35 -0400)
This support should be removed in favor of something that actually works
in all the weird cases. However this is simple and is enough to allow
Bioshock Infinite to render properly on nvc0.

Since the functionality is not implemented correctly, the extension will
not appear in the extension string and mesa will still return
INVALID_OPERATION for any glCopyImageSubData calls. In order to make use
of this functionality, run with
MESA_EXTENSION_OVERRIDE=GL_ARB_copy_image

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/state_tracker/st_cb_texture.c

index 4f2ef6b0137724a5cd237d66103168bcb9231cd6..40bc29e9c99a91a9a6edd390b3349f769c486279 100644 (file)
@@ -1873,6 +1873,31 @@ st_TextureView(struct gl_context *ctx,
    return GL_TRUE;
 }
 
+/* HACK: this is only enough for the most basic uses of CopyImage. Must fix
+ * before actually exposing the extension.
+ */
+static void
+st_CopyImageSubData(struct gl_context *ctx,
+                    struct gl_texture_image *src_image,
+                    int src_x, int src_y, int src_z,
+                    struct gl_texture_image *dst_image,
+                    int dst_x, int dst_y, int dst_z,
+                    int src_width, int src_height)
+{
+   struct st_context *st = st_context(ctx);
+   struct pipe_context *pipe = st->pipe;
+   struct st_texture_image *src = st_texture_image(src_image);
+   struct st_texture_image *dst = st_texture_image(dst_image);
+
+   struct pipe_box box;
+
+   u_box_2d_zslice(src_x, src_y, src_z, src_width, src_height, &box);
+   pipe->resource_copy_region(pipe, dst->pt, dst_image->Level,
+                              dst_x, dst_y, dst_z,
+                              src->pt, src_image->Level,
+                              &box);
+}
+
 
 void
 st_init_texture_functions(struct dd_function_table *functions)
@@ -1905,4 +1930,6 @@ st_init_texture_functions(struct dd_function_table *functions)
 
    functions->AllocTextureStorage = st_AllocTextureStorage;
    functions->TextureView = st_TextureView;
+
+   functions->CopyImageSubData = st_CopyImageSubData;
 }