summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIlia Mirkin <[email protected]>2015-07-20 15:19:53 -0400
committerIlia Mirkin <[email protected]>2015-08-19 02:35:38 -0400
commitf33a7ab150ea01f3550904fe3c56fcad32ce85e0 (patch)
tree89365c74cd3981ccd4041846977fa8473417955b /src
parent89759381dbfe3784bc780a3ab6e0fe13e77e06ef (diff)
st/mesa: add fake ARB_copy_image support in Gallium
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 <[email protected]> Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/state_tracker/st_cb_texture.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 4f2ef6b0137..40bc29e9c99 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -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;
}