summaryrefslogtreecommitdiff
path: root/src/drm/cairo-drm-gallium-surface.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drm/cairo-drm-gallium-surface.c')
-rw-r--r--src/drm/cairo-drm-gallium-surface.c38
1 files changed, 26 insertions, 12 deletions
diff --git a/src/drm/cairo-drm-gallium-surface.c b/src/drm/cairo-drm-gallium-surface.c
index 40446277..a284e5f8 100644
--- a/src/drm/cairo-drm-gallium-surface.c
+++ b/src/drm/cairo-drm-gallium-surface.c
@@ -53,6 +53,8 @@
#include <util/u_simple_shaders.h>
#include <util/u_draw_quad.h>
+#include <util/u_debug.h>
+
#include <tgsi/tgsi_ureg.h>
#include <tgsi/tgsi_build.h>
#include <tgsi/tgsi_parse.h>
@@ -302,6 +304,7 @@ shader_create(gallium_device_t *device)
shader = malloc (sizeof(gallium_shader_t));
shader->device = device;
shader->fs = cso_hash_create();
+ shader->cbuf = NULL;
return shader;
}
@@ -318,18 +321,18 @@ static void
setup_constant_buffer(gallium_shader_t *shader, float *constants, int size)
{
struct pipe_context *ctx = shader->device->pipe;
- struct pipe_resource *buffer = shader->cbuf;
+ struct pipe_resource **buffer = &shader->cbuf;
- pipe_resource_reference (&buffer, NULL);
+ pipe_resource_reference (buffer, NULL);
memcpy (shader->constants, constants, size);
- buffer = pipe_user_buffer_create (ctx->screen,
- &shader->constants,
+ *buffer = pipe_user_buffer_create (ctx->screen,
+ &shader->constants[0],
sizeof(shader->constants),
PIPE_BIND_VERTEX_BUFFER);
- ctx->set_constant_buffer (ctx, PIPE_SHADER_FRAGMENT, 0, buffer);
+ ctx->set_constant_buffer (ctx, PIPE_SHADER_FRAGMENT, 0, *buffer);
}
static void *
@@ -443,11 +446,12 @@ unpack_color (const unsigned *src,
unsigned char *pRow = p;
for (j = 0; j < w; j++, pRow += 4) {
const unsigned pixel = *src++;
- pRow[0] = (pixel >> 0) & 0xff;
- pRow[1] = (pixel >> 8) & 0xff;
- pRow[2] = (pixel >> 16) & 0xff;
- pRow[3] = (pixel >> 24) & 0xff;
+ pRow[3] = (pixel >> 0) & 0xff;
+ pRow[2] = (pixel >> 8) & 0xff;
+ pRow[1] = (pixel >> 16) & 0xff;
+ pRow[0] = (pixel >> 24) & 0xff;
}
+
p += dst_stride;
}
}
@@ -505,8 +509,6 @@ gallium_surface_acquire_source_image (void *abstract_surface,
surface->drm.height) *
util_format_get_blocksize(surface->texture->format));
- rgba_packed = malloc (surface->drm.width*surface->drm.height*4);
-
stride = util_format_get_stride(surface->texture->format, surface->drm.width);
pipe_get_tile_raw (device->pipe,
@@ -517,13 +519,15 @@ gallium_surface_acquire_source_image (void *abstract_surface,
rgba_packed,
stride);
+ color_unpacked = malloc(surface->drm.width*surface->drm.height*4);
+
unpack_color (rgba_packed, surface->drm.width, surface->drm.height, color_unpacked, stride);
cairo_device_release (&device->drm.base);
image = cairo_image_surface_create_for_data (color_unpacked, format,
surface->drm.width,
surface->drm.height,
- surface->drm.stride);
+ stride);
if (unlikely (image->status))
return image->status;
@@ -556,6 +560,7 @@ gallium_surface_flush (void *abstract_surface)
gallium_device_t *device = gallium_device (surface);
cairo_status_t status;
+ printf("fudeo");
{
cso_set_framebuffer (device->cso, &device->framebuffer);
@@ -577,6 +582,7 @@ gallium_surface_flush (void *abstract_surface)
device->pipe->flush (device->pipe,
PIPE_FLUSH_RENDER_CACHE,
NULL);
+ printf("flush\n");
return CAIRO_STATUS_SUCCESS;
}
@@ -593,10 +599,14 @@ gallium_surface_flush (void *abstract_surface)
cairo_device_release (&device->drm.base);
}
+ printf("flushing");
+
status = cairo_surface_status (surface->fallback);
cairo_surface_destroy (surface->fallback);
surface->fallback = NULL;
+ debug_dump_surface_bmp(device->pipe, "result.bmp", device->framebuffer.cbufs[0]);
+
return status;
}
@@ -922,6 +932,8 @@ gallium_surface_paint (void *abstract_surface,
status = _cairo_surface_paint (surface->fallback, op, source, clip);
}
+ gallium_surface_flush(abstract_surface);
+
return status;
}
@@ -1205,6 +1217,8 @@ gallium_surface_create_internal (gallium_device_t *device,
device->pipe->set_constant_buffer(device->pipe, PIPE_SHADER_VERTEX, 0, surface->vbuf);
}
+ device->cso = cso_create_context(device->pipe);
+
memset(&device->framebuffer, 0, sizeof(device->framebuffer));
device->framebuffer.width = width;
device->framebuffer.height = height;