summaryrefslogtreecommitdiffstats
path: root/src/gallium/include
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2015-10-09 01:38:08 +0100
committerDave Airlie <[email protected]>2015-10-31 16:04:36 +1000
commit2b676570960277d47477822ffeccc672613f9142 (patch)
tree84194de9b3e72ac548512b07c57e6a938d5efa19 /src/gallium/include
parent103de0225b1e22aabc3e132ff30393765061ff03 (diff)
gallium/swrast: fix front buffer blitting. (v2)
So I've known this was broken before, cogl has a workaround for it from what I know, but with the gallium based swrast drivers BlitFramebuffer from back to front or vice-versa was pretty broken. The legacy swrast driver tracks when a front buffer is used and does the get/put images when it is mapped/unmapped, so this patch attempts to add the same functionality to the gallium drivers. It creates a new context interface to denote when a front buffer is being created, and passes a private pointer to it, this pointer is then used to decide on map/unmap if the contents should be updated from the real frontbuffer using get/put image. This is primarily to make gtk's gl code work, the only thing I've tested so far is the glarea test from https://github.com/ebassi/glarea-example.git v2: bump extension version, check extension version before calling get image. (Ian) Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91930 Cc: <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/gallium/include')
-rw-r--r--src/gallium/include/pipe/p_screen.h4
-rw-r--r--src/gallium/include/state_tracker/drisw_api.h3
-rw-r--r--src/gallium/include/state_tracker/sw_winsys.h1
3 files changed, 8 insertions, 0 deletions
diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h
index a22fb938dbb..f868d71db23 100644
--- a/src/gallium/include/pipe/p_screen.h
+++ b/src/gallium/include/pipe/p_screen.h
@@ -169,6 +169,10 @@ struct pipe_screen {
struct pipe_resource * (*resource_create)(struct pipe_screen *,
const struct pipe_resource *templat);
+ struct pipe_resource * (*resource_create_front)(struct pipe_screen *,
+ const struct pipe_resource *templat,
+ const void *map_front_private);
+
/**
* Create a texture from a winsys_handle. The handle is often created in
* another process by first creating a pipe texture and then calling
diff --git a/src/gallium/include/state_tracker/drisw_api.h b/src/gallium/include/state_tracker/drisw_api.h
index 328440cf5ff..cd5a27e2482 100644
--- a/src/gallium/include/state_tracker/drisw_api.h
+++ b/src/gallium/include/state_tracker/drisw_api.h
@@ -11,6 +11,9 @@ struct dri_drawable;
*/
struct drisw_loader_funcs
{
+ void (*get_image) (struct dri_drawable *dri_drawable,
+ int x, int y, unsigned width, unsigned height, unsigned stride,
+ void *data);
void (*put_image) (struct dri_drawable *dri_drawable,
void *data, unsigned width, unsigned height);
void (*put_image2) (struct dri_drawable *dri_drawable,
diff --git a/src/gallium/include/state_tracker/sw_winsys.h b/src/gallium/include/state_tracker/sw_winsys.h
index a3479eb0bc3..0b792cd0ce4 100644
--- a/src/gallium/include/state_tracker/sw_winsys.h
+++ b/src/gallium/include/state_tracker/sw_winsys.h
@@ -90,6 +90,7 @@ struct sw_winsys
enum pipe_format format,
unsigned width, unsigned height,
unsigned alignment,
+ const void *front_private,
unsigned *stride );
/**