summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander von Gluck IV <[email protected]>2013-10-28 11:38:27 -0500
committerAlexander von Gluck IV <[email protected]>2013-10-29 15:27:40 -0500
commit439dd0e20a3ec5b95487d7ddeb0a8f91781b7b00 (patch)
tree0662ae732b0c23d1f9631bb353e04d1520e179e0
parentb8f89fc5cbd41a45130630080ffc921c60604545 (diff)
winsys: Correct Haiku winsys display target code
* Instead of assuming the displaytarget is the same stride / colorspace as the destination, lets actually check the source bitmap. * Fixes random stride issues in rendering Acked-by: Brian Paul <[email protected]>
-rw-r--r--src/gallium/winsys/sw/hgl/bitmap_wrapper.cpp20
-rw-r--r--src/gallium/winsys/sw/hgl/bitmap_wrapper.h5
-rw-r--r--src/gallium/winsys/sw/hgl/hgl_sw_winsys.c20
-rw-r--r--src/gallium/winsys/sw/hgl/hgl_sw_winsys.h4
4 files changed, 41 insertions, 8 deletions
diff --git a/src/gallium/winsys/sw/hgl/bitmap_wrapper.cpp b/src/gallium/winsys/sw/hgl/bitmap_wrapper.cpp
index 4015a226889..ef81edc8a57 100644
--- a/src/gallium/winsys/sw/hgl/bitmap_wrapper.cpp
+++ b/src/gallium/winsys/sw/hgl/bitmap_wrapper.cpp
@@ -77,10 +77,22 @@ void
copy_bitmap_bits(const Bitmap* bitmap, void* data, int32 length)
{
BBitmap *bb = (BBitmap*)bitmap;
- if (bb) {
- color_space cs = bb->ColorSpace();
- bb->ImportBits(data, length, bb->BytesPerRow(), 0, cs);
- }
+
+ // We assume the data is 1:1 the format of the bitmap
+ if (bb)
+ bb->ImportBits(data, length, bb->BytesPerRow(), 0, bb->ColorSpace());
+}
+
+
+void
+import_bitmap_bits(const Bitmap* bitmap, void* data, int32 length,
+ unsigned srcStride, color_space srcColorSpace)
+{
+ BBitmap *bb = (BBitmap*)bitmap;
+
+ // Import image and adjust image format from source to dest
+ if (bb)
+ bb->ImportBits(data, length, srcStride, 0, srcColorSpace);
}
diff --git a/src/gallium/winsys/sw/hgl/bitmap_wrapper.h b/src/gallium/winsys/sw/hgl/bitmap_wrapper.h
index 7c5ff2d72f9..65ba14044d8 100644
--- a/src/gallium/winsys/sw/hgl/bitmap_wrapper.h
+++ b/src/gallium/winsys/sw/hgl/bitmap_wrapper.h
@@ -40,14 +40,17 @@ extern "C" {
Bitmap* create_bitmap(int32 width, int32 height, color_space colorSpace);
+void delete_bitmap(Bitmap* bitmap);
+
void copy_bitmap_bits(const Bitmap* bitmap, void* data, int32 length);
+void import_bitmap_bits(const Bitmap* bitmap, void* data, int32 length,
+ unsigned srcStride, color_space srcColorSpace);
void get_bitmap_size(const Bitmap* bitmap, int32* width, int32* height);
color_space get_bitmap_color_space(const Bitmap* bitmap);
int32 get_bitmap_bytes_per_row(const Bitmap* bitmap);
int32 get_bitmap_bits_length(const Bitmap* bitmap);
-void delete_bitmap(Bitmap* bitmap);
void dump_bitmap(const Bitmap* bitmap);
diff --git a/src/gallium/winsys/sw/hgl/hgl_sw_winsys.c b/src/gallium/winsys/sw/hgl/hgl_sw_winsys.c
index 1d51dd60ee8..b09584c39a4 100644
--- a/src/gallium/winsys/sw/hgl/hgl_sw_winsys.c
+++ b/src/gallium/winsys/sw/hgl/hgl_sw_winsys.c
@@ -34,7 +34,6 @@
#include "util/u_memory.h"
#include "hgl_sw_winsys.h"
-#include "bitmap_wrapper.h"
// Cast
@@ -60,6 +59,19 @@ hgl_winsys_is_displaytarget_format_supported(struct sw_winsys* winsys,
return true;
}
+static color_space
+hgl_winsys_convert_cs(enum pipe_format format)
+{
+ // TODO: B_RGB24, B_RGB16, B_RGB15?
+ switch(format) {
+ case PIPE_FORMAT_B5G6R5_UNORM:
+ return B_CMAP8;
+ case PIPE_FORMAT_A8R8G8B8_UNORM:
+ case PIPE_FORMAT_X8R8G8B8_UNORM:
+ default:
+ return B_RGB32;
+ }
+}
static struct sw_displaytarget*
hgl_winsys_displaytarget_create(struct sw_winsys* winsys,
@@ -70,6 +82,7 @@ hgl_winsys_displaytarget_create(struct sw_winsys* winsys,
= CALLOC_STRUCT(haiku_displaytarget);
assert(haikuDisplayTarget);
+ haikuDisplayTarget->colorSpace = hgl_winsys_convert_cs(format);
haikuDisplayTarget->format = format;
haikuDisplayTarget->width = width;
haikuDisplayTarget->height = height;
@@ -156,8 +169,9 @@ hgl_winsys_displaytarget_display(struct sw_winsys* winsys,
struct haiku_displaytarget* haikuDisplayTarget
= hgl_sw_displaytarget(displayTarget);
- copy_bitmap_bits(bitmap, haikuDisplayTarget->data,
- haikuDisplayTarget->size);
+ import_bitmap_bits(bitmap, haikuDisplayTarget->data,
+ haikuDisplayTarget->size, haikuDisplayTarget->stride,
+ haikuDisplayTarget->colorSpace);
return;
}
diff --git a/src/gallium/winsys/sw/hgl/hgl_sw_winsys.h b/src/gallium/winsys/sw/hgl/hgl_sw_winsys.h
index 4c706a51233..5a2bef7ac7f 100644
--- a/src/gallium/winsys/sw/hgl/hgl_sw_winsys.h
+++ b/src/gallium/winsys/sw/hgl/hgl_sw_winsys.h
@@ -32,10 +32,14 @@
#include "state_tracker/st_api.h"
#include "state_tracker/sw_winsys.h"
+#include "bitmap_wrapper.h"
+
struct haiku_displaytarget
{
enum pipe_format format;
+ color_space colorSpace;
+
unsigned width;
unsigned height;
unsigned stride;