summaryrefslogtreecommitdiffstats
path: root/src/gallium/winsys/sw
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/winsys/sw
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/winsys/sw')
-rw-r--r--src/gallium/winsys/sw/dri/dri_sw_winsys.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/gallium/winsys/sw/dri/dri_sw_winsys.c b/src/gallium/winsys/sw/dri/dri_sw_winsys.c
index 8451d832806..5c98f2603c7 100644
--- a/src/gallium/winsys/sw/dri/dri_sw_winsys.c
+++ b/src/gallium/winsys/sw/dri/dri_sw_winsys.c
@@ -44,8 +44,10 @@ struct dri_sw_displaytarget
unsigned height;
unsigned stride;
+ unsigned map_flags;
void *data;
void *mapped;
+ const void *front_private;
};
struct dri_sw_winsys
@@ -83,6 +85,7 @@ dri_sw_displaytarget_create(struct sw_winsys *winsys,
enum pipe_format format,
unsigned width, unsigned height,
unsigned alignment,
+ const void *front_private,
unsigned *stride)
{
struct dri_sw_displaytarget *dri_sw_dt;
@@ -95,6 +98,7 @@ dri_sw_displaytarget_create(struct sw_winsys *winsys,
dri_sw_dt->format = format;
dri_sw_dt->width = width;
dri_sw_dt->height = height;
+ dri_sw_dt->front_private = front_private;
format_stride = util_format_get_stride(format, width);
dri_sw_dt->stride = align(format_stride, alignment);
@@ -133,6 +137,12 @@ dri_sw_displaytarget_map(struct sw_winsys *ws,
{
struct dri_sw_displaytarget *dri_sw_dt = dri_sw_displaytarget(dt);
dri_sw_dt->mapped = dri_sw_dt->data;
+
+ if (dri_sw_dt->front_private && (flags & PIPE_TRANSFER_READ)) {
+ struct dri_sw_winsys *dri_sw_ws = dri_sw_winsys(ws);
+ dri_sw_ws->lf->get_image((void *)dri_sw_dt->front_private, 0, 0, dri_sw_dt->width, dri_sw_dt->height, dri_sw_dt->stride, dri_sw_dt->data);
+ }
+ dri_sw_dt->map_flags = flags;
return dri_sw_dt->mapped;
}
@@ -141,6 +151,11 @@ dri_sw_displaytarget_unmap(struct sw_winsys *ws,
struct sw_displaytarget *dt)
{
struct dri_sw_displaytarget *dri_sw_dt = dri_sw_displaytarget(dt);
+ if (dri_sw_dt->front_private && (dri_sw_dt->map_flags & PIPE_TRANSFER_WRITE)) {
+ struct dri_sw_winsys *dri_sw_ws = dri_sw_winsys(ws);
+ dri_sw_ws->lf->put_image2((void *)dri_sw_dt->front_private, dri_sw_dt->data, 0, 0, dri_sw_dt->width, dri_sw_dt->height, dri_sw_dt->stride);
+ }
+ dri_sw_dt->map_flags = 0;
dri_sw_dt->mapped = NULL;
}