[Mesa-dev] [PATCH] gallium/state_tracker: Rewrite Haiku's state tracker
Alexander von Gluck IV
kallisti5 at unixzen.com
Wed Dec 31 13:43:40 PST 2014
* More gallium-like
* Leverage stamps properly and don't call mesa functions
---
src/gallium/state_trackers/hgl/hgl.c | 338 +++++++++++---------
src/gallium/state_trackers/hgl/hgl_context.h | 13 +-
.../targets/haiku-softpipe/GalliumContext.cpp | 59 +++--
.../targets/haiku-softpipe/GalliumContext.h | 4 +-
.../targets/haiku-softpipe/SoftwareRenderer.cpp | 24 +-
.../targets/haiku-softpipe/SoftwareRenderer.h | 2 -
src/gallium/winsys/sw/hgl/hgl_sw_winsys.c | 24 ++-
7 files changed, 274 insertions(+), 190 deletions(-)
diff --git a/src/gallium/state_trackers/hgl/hgl.c b/src/gallium/state_trackers/hgl/hgl.c
index 0b30290..b75dc26 100644
--- a/src/gallium/state_trackers/hgl/hgl.c
+++ b/src/gallium/state_trackers/hgl/hgl.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2012-2013, Haiku, Inc. All Rights Reserved.
+ * Copyright 2012-2014, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
@@ -10,12 +10,11 @@
#include "GLView.h"
-#include "main/context.h"
-#include "main/framebuffer.h"
-#include "main/renderbuffer.h"
#include "pipe/p_format.h"
#include "util/u_atomic.h"
+#include "util/u_format.h"
#include "util/u_memory.h"
+#include "util/u_inlines.h"
#include "hgl_context.h"
@@ -30,18 +29,38 @@
#define ERROR(x...) printf("hgl:state_tracker: " x)
+// Perform a safe void to hgl_context cast
+static INLINE struct hgl_context*
+hgl_st_context(struct st_context_iface *stctxi)
+{
+ struct hgl_context* context;
+ assert(stctxi);
+ context = (struct hgl_context*)stctxi->st_manager_private;
+ assert(context);
+ return context;
+}
+
+
+// Perform a safe void to hgl_buffer cast
+static INLINE struct hgl_buffer*
+hgl_st_framebuffer(struct st_framebuffer_iface *stfbi)
+{
+ struct hgl_buffer* buffer;
+ assert(stfbi);
+ buffer = (struct hgl_buffer*)stfbi->st_manager_private;
+ assert(buffer);
+ return buffer;
+}
+
+
static boolean
-hgl_st_framebuffer_flush_front(struct st_context_iface *stctx,
- struct st_framebuffer_iface* stfb, enum st_attachment_type statt)
+hgl_st_framebuffer_flush_front(struct st_context_iface *stctxi,
+ struct st_framebuffer_iface* stfbi, enum st_attachment_type statt)
{
CALLED();
- struct hgl_context* context = (struct hgl_context*)stfb->st_manager_private;
-
- if (!context) {
- ERROR("%s: Couldn't obtain valid hgl_context!\n", __func__);
- return FALSE;
- }
+ //struct hgl_context* context = hgl_st_context(stctxi);
+ //struct hgl_buffer* buffer = hgl_st_context(stfbi);
#if 0
struct stw_st_framebuffer *stwfb = stw_st_framebuffer(stfb);
@@ -56,77 +75,125 @@ hgl_st_framebuffer_flush_front(struct st_context_iface *stctx,
}
+static boolean
+hgl_st_framebuffer_validate_textures(struct st_framebuffer_iface *stfbi,
+ unsigned width, unsigned height, unsigned mask)
+{
+ struct hgl_buffer* buffer;
+ enum st_attachment_type i;
+ struct pipe_resource templat;
+
+ CALLED();
+
+ buffer = hgl_st_framebuffer(stfbi);
+
+ if (buffer->width != width || buffer->height != height) {
+ for (i = 0; i < ST_ATTACHMENT_COUNT; i++)
+ pipe_resource_reference(&buffer->textures[i], NULL);
+ }
+
+ memset(&templat, 0, sizeof(templat));
+ templat.target = buffer->target;
+ templat.width0 = width;
+ templat.height0 = height;
+ templat.depth0 = 1;
+ templat.array_size = 1;
+ templat.last_level = 0;
+
+ for (i = 0; i < ST_ATTACHMENT_COUNT; i++) {
+ enum pipe_format format;
+ unsigned bind;
+
+ switch (i) {
+ case ST_ATTACHMENT_FRONT_LEFT:
+ case ST_ATTACHMENT_BACK_LEFT:
+ case ST_ATTACHMENT_FRONT_RIGHT:
+ case ST_ATTACHMENT_BACK_RIGHT:
+ format = buffer->visual->color_format;
+ bind = PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_RENDER_TARGET;
+ break;
+ case ST_ATTACHMENT_DEPTH_STENCIL:
+ format = buffer->visual->depth_stencil_format;
+ bind = PIPE_BIND_DEPTH_STENCIL;
+ break;
+ default:
+ format = PIPE_FORMAT_NONE;
+ bind = 0;
+ break;
+ }
+
+ if (format != PIPE_FORMAT_NONE) {
+ templat.format = format;
+ templat.bind = bind;
+ buffer->textures[i] = buffer->screen->resource_create(buffer->screen,
+ &templat);
+ if (!buffer->textures[i])
+ return FALSE;
+ }
+ }
+
+ buffer->width = width;
+ buffer->height = height;
+ buffer->mask = mask;
+
+ return TRUE;
+}
+
+
/**
* Called by the st manager to validate the framebuffer (allocate
* its resources).
*/
static boolean
-hgl_st_framebuffer_validate(struct st_context_iface *stctx,
+hgl_st_framebuffer_validate(struct st_context_iface *stctxi,
struct st_framebuffer_iface *stfbi, const enum st_attachment_type *statts,
unsigned count, struct pipe_resource **out)
{
+ struct hgl_context* context;
+ struct hgl_buffer* buffer;
+ unsigned stAttachmentMask, newMask;
+ unsigned i;
+ boolean resized;
+
CALLED();
- if (!stfbi) {
- ERROR("%s: Invalid st framebuffer interface!\n", __func__);
- return FALSE;
- }
+ context = hgl_st_context(stctxi);
+ buffer = hgl_st_framebuffer(stfbi);
- struct hgl_context* context = (struct hgl_context*)stfbi->st_manager_private;
+ //int32 width = 0;
+ //int32 height = 0;
+ //get_bitmap_size(context->bitmap, &width, &height);
- if (!context) {
- ERROR("%s: Couldn't obtain valid hgl_context!\n", __func__);
- return FALSE;
- }
+ // Build mask of current attachments
+ stAttachmentMask = 0;
+ for (i = 0; i < count; i++)
+ stAttachmentMask |= 1 << statts[i];
- int32 width = 0;
- int32 height = 0;
- get_bitmap_size(context->bitmap, &width, &height);
+ newMask = stAttachmentMask & ~buffer->mask;
- struct pipe_resource templat;
- memset(&templat, 0, sizeof(templat));
- templat.target = PIPE_TEXTURE_RECT;
- templat.width0 = width;
- templat.height0 = height;
- templat.depth0 = 1;
- templat.array_size = 1;
- templat.usage = PIPE_USAGE_DEFAULT;
-
- if (context->stVisual && context->manager && context->manager->screen) {
- TRACE("%s: Updating resources\n", __func__);
- for (unsigned i = 0; i < count; i++) {
- enum pipe_format format = PIPE_FORMAT_NONE;
- unsigned bind = 0;
-
- switch(statts[i]) {
- case ST_ATTACHMENT_FRONT_LEFT:
- case ST_ATTACHMENT_BACK_LEFT:
- format = context->stVisual->color_format;
- bind = PIPE_BIND_DISPLAY_TARGET
- | PIPE_BIND_RENDER_TARGET;
- break;
- case ST_ATTACHMENT_DEPTH_STENCIL:
- format = context->stVisual->depth_stencil_format;
- bind = PIPE_BIND_DEPTH_STENCIL;
- break;
- case ST_ATTACHMENT_ACCUM:
- format = context->stVisual->accum_format;
- bind = PIPE_BIND_RENDER_TARGET;
- break;
- default:
- format = PIPE_FORMAT_NONE;
- break;
- }
-
- if (format != PIPE_FORMAT_NONE) {
- templat.format = format;
- templat.bind = bind;
-
- struct pipe_screen* screen = context->manager->screen;
- context->textures[i] = screen->resource_create(screen, &templat);
- out[i] = context->textures[i];
- }
- }
+ resized = (buffer->width != context->width)
+ || (buffer->height != context->height);
+
+ if (resized || newMask) {
+ boolean ret;
+ TRACE("%s: resize event. old: %d x %d; new: %d x %d\n", __func__,
+ buffer->width, buffer->height, context->width, context->height);
+
+ ret = hgl_st_framebuffer_validate_textures(stfbi,
+ context->width, context->height, stAttachmentMask);
+
+ if (!ret)
+ return ret;
+
+ // TODO: Simply update attachments
+ //if (!resized) {
+
+ //}
+ }
+
+ for (i = 0; i < count; i++) {
+ out[i] = NULL;
+ pipe_resource_reference(&out[i], buffer->textures[statts[i]]);
}
return TRUE;
@@ -140,9 +207,6 @@ hgl_st_manager_get_param(struct st_manager *smapi, enum st_manager_param param)
switch (param) {
case ST_MANAGER_BROKEN_INVALIDATE:
- TRACE("%s: TODO: How should we handle BROKEN_INVALIDATE calls?\n",
- __func__);
- // For now we force validation of the framebuffer.
return 1;
}
@@ -156,53 +220,58 @@ hgl_st_manager_get_param(struct st_manager *smapi, enum st_manager_param param)
struct hgl_buffer *
hgl_create_st_framebuffer(struct hgl_context* context)
{
+ struct hgl_buffer *buffer;
CALLED();
- struct hgl_buffer *buffer = CALLOC_STRUCT(hgl_buffer);
-
+ // Our requires before creating a framebuffer
assert(context);
+ assert(context->screen);
assert(context->stVisual);
- if (buffer) {
- // Copy context visual into framebuffer
- memcpy(&buffer->visual, context->stVisual, sizeof(struct st_visual));
+ buffer = CALLOC_STRUCT(hgl_buffer);
+ assert(buffer);
- // calloc and configure our st_framebuffer interface
- buffer->stfbi = CALLOC_STRUCT(st_framebuffer_iface);
- if (!buffer->stfbi) {
- ERROR("%s: Couldn't calloc framebuffer!\n", __func__);
- return NULL;
- }
+ // calloc and configure our st_framebuffer interface
+ buffer->stfbi = CALLOC_STRUCT(st_framebuffer_iface);
+ assert(buffer->stfbi);
- struct st_framebuffer_iface* stfbi = buffer->stfbi;
- p_atomic_set(&stfbi->stamp, 1);
- stfbi->flush_front = hgl_st_framebuffer_flush_front;
- stfbi->validate = hgl_st_framebuffer_validate;
- stfbi->st_manager_private = (void*)context;
- stfbi->visual = &buffer->visual;
+ // Prepare our buffer
+ buffer->visual = context->stVisual;
+ buffer->screen = context->screen;
- // TODO: Do we need linked list?
- }
+ if (context->screen->get_param(buffer->screen, PIPE_CAP_NPOT_TEXTURES))
+ buffer->target = PIPE_TEXTURE_2D;
+ else
+ buffer->target = PIPE_TEXTURE_RECT;
+
+ // Prepare our state_tracker interface
+ buffer->stfbi->flush_front = hgl_st_framebuffer_flush_front;
+ buffer->stfbi->validate = hgl_st_framebuffer_validate;
+ buffer->stfbi->visual = context->stVisual;
+
+ p_atomic_set(&buffer->stfbi->stamp, 1);
+ buffer->stfbi->st_manager_private = (void*)buffer;
- return buffer;
+ return buffer;
}
struct st_manager *
-hgl_create_st_manager(struct pipe_screen* screen)
+hgl_create_st_manager(struct hgl_context* context)
{
+ struct st_manager* manager;
+
CALLED();
- assert(screen);
- struct st_manager* manager = CALLOC_STRUCT(st_manager);
+ // Required things
+ assert(context);
+ assert(context->screen);
- if (!manager) {
- ERROR("%s: Couldn't allocate state tracker manager!\n", __func__);
- return NULL;
- }
+ manager = CALLOC_STRUCT(st_manager);
+ assert(manager);
//manager->display = dpy;
- manager->screen = screen;
+ manager->screen = context->screen;
manager->get_param = hgl_st_manager_get_param;
return manager;
@@ -221,56 +290,26 @@ hgl_destroy_st_manager(struct st_manager *manager)
struct st_visual*
hgl_create_st_visual(ulong options)
{
- struct st_visual* visual = CALLOC_STRUCT(st_visual);
- if (!visual) {
- ERROR("%s: Couldn't allocate st_visual\n", __func__);
- return NULL;
- }
+ struct st_visual* visual;
- // Calculate visual configuration
- const GLboolean rgbFlag = ((options & BGL_INDEX) == 0);
- const GLboolean alphaFlag = ((options & BGL_ALPHA) == BGL_ALPHA);
- const GLboolean dblFlag = ((options & BGL_DOUBLE) == BGL_DOUBLE);
- const GLboolean stereoFlag = false;
- const GLboolean depthFlag = ((options & BGL_DEPTH) == BGL_DEPTH);
- const GLboolean stencilFlag = ((options & BGL_STENCIL) == BGL_STENCIL);
- const GLboolean accumFlag = ((options & BGL_ACCUM) == BGL_ACCUM);
-
- const GLint red = rgbFlag ? 8 : 5;
- const GLint green = rgbFlag ? 8 : 5;
- const GLint blue = rgbFlag ? 8 : 5;
- const GLint alpha = alphaFlag ? 8 : 0;
-
- TRACE("rgb :\t%d\n", (bool)rgbFlag);
- TRACE("alpha :\t%d\n", (bool)alphaFlag);
- TRACE("dbl :\t%d\n", (bool)dblFlag);
- TRACE("stereo :\t%d\n", (bool)stereoFlag);
- TRACE("depth :\t%d\n", (bool)depthFlag);
- TRACE("stencil :\t%d\n", (bool)stencilFlag);
- TRACE("accum :\t%d\n", (bool)accumFlag);
- TRACE("red :\t%d\n", red);
- TRACE("green :\t%d\n", green);
- TRACE("blue :\t%d\n", blue);
- TRACE("alpha :\t%d\n", alpha);
+ CALLED();
+
+ visual = CALLOC_STRUCT(st_visual);
+ assert(visual);
// Determine color format
- if (red == 8) {
- // Color format
- if (alpha == 8)
- visual->color_format = PIPE_FORMAT_B8G8R8A8_UNORM;
- else
- visual->color_format = PIPE_FORMAT_B8G8R8X8_UNORM;
-
- // Depth buffer
- if (depthFlag)
- visual->depth_stencil_format = PIPE_FORMAT_Z32_UNORM;
- else
- visual->depth_stencil_format = PIPE_FORMAT_NONE;
- } else {
+ if ((options & BGL_INDEX) != 0) {
+ // Index color
visual->color_format = PIPE_FORMAT_B5G6R5_UNORM;
-
// TODO: Indexed color depth buffer?
visual->depth_stencil_format = PIPE_FORMAT_NONE;
+ } else {
+ // RGB color
+ visual->color_format = (options & BGL_ALPHA)
+ ? PIPE_FORMAT_BGRA8888_UNORM : PIPE_FORMAT_BGRX8888_UNORM;
+ // TODO: Determine additional stencil formats
+ visual->depth_stencil_format = (options & BGL_DEPTH)
+ ? PIPE_FORMAT_Z24_UNORM_S8_UINT : PIPE_FORMAT_NONE;
}
visual->accum_format = (options & BGL_ACCUM)
@@ -279,20 +318,25 @@ hgl_create_st_visual(ulong options)
visual->buffer_mask |= ST_ATTACHMENT_FRONT_LEFT_MASK;
visual->render_buffer = ST_ATTACHMENT_FRONT_LEFT;
- if (dblFlag) {
+ if ((options & BGL_DOUBLE) != 0) {
visual->buffer_mask |= ST_ATTACHMENT_BACK_LEFT_MASK;
visual->render_buffer = ST_ATTACHMENT_BACK_LEFT;
}
- if (stereoFlag) {
+ #if 0
+ if ((options & BGL_STEREO) != 0) {
visual->buffer_mask |= ST_ATTACHMENT_FRONT_RIGHT_MASK;
- if (dblFlag)
+ if ((options & BGL_DOUBLE) != 0)
visual->buffer_mask |= ST_ATTACHMENT_BACK_RIGHT_MASK;
}
+ #endif
if ((options & BGL_DEPTH) || (options & BGL_STENCIL))
visual->buffer_mask |= ST_ATTACHMENT_DEPTH_STENCIL_MASK;
+ TRACE("%s: Visual color format: %s\n", __func__,
+ util_format_name(visual->color_format));
+
return visual;
}
diff --git a/src/gallium/state_trackers/hgl/hgl_context.h b/src/gallium/state_trackers/hgl/hgl_context.h
index 1d98414..4840d9e 100644
--- a/src/gallium/state_trackers/hgl/hgl_context.h
+++ b/src/gallium/state_trackers/hgl/hgl_context.h
@@ -37,7 +37,10 @@ struct hgl_buffer
unsigned width;
unsigned height;
+ unsigned mask;
+ struct pipe_screen* screen;
+ enum pipe_texture_target target;
struct pipe_resource* textures[ST_ATTACHMENT_COUNT];
void *map;
@@ -57,12 +60,18 @@ struct hgl_context
struct st_visual* stVisual;
// State Tracker Visual
- struct pipe_resource* textures[ST_ATTACHMENT_COUNT];
+ struct pipe_screen* screen;
+
+ //struct pipe_resource* textures[ST_ATTACHMENT_COUNT];
// Post processing
struct pp_queue_t* postProcess;
unsigned int postProcessEnable[PP_FILTERS];
+ // Desired viewport size
+ unsigned width;
+ unsigned height;
+
Bitmap* bitmap;
color_space colorSpace;
@@ -77,7 +86,7 @@ struct hgl_context
struct hgl_buffer* hgl_create_st_framebuffer(struct hgl_context* context);
// hgl state_tracker manager
-struct st_manager* hgl_create_st_manager(struct pipe_screen* screen);
+struct st_manager* hgl_create_st_manager(struct hgl_context* screen);
void hgl_destroy_st_manager(struct st_manager *manager);
// hgl state_tracker visual
diff --git a/src/gallium/targets/haiku-softpipe/GalliumContext.cpp b/src/gallium/targets/haiku-softpipe/GalliumContext.cpp
index 62db7e2..f9d7dfc 100644
--- a/src/gallium/targets/haiku-softpipe/GalliumContext.cpp
+++ b/src/gallium/targets/haiku-softpipe/GalliumContext.cpp
@@ -15,7 +15,6 @@
#include "bitmap_wrapper.h"
extern "C" {
#include "glapi/glapi.h"
-#include "main/viewport.h"
#include "pipe/p_format.h"
#include "state_tracker/st_cb_fbo.h"
#include "state_tracker/st_cb_flush.h"
@@ -24,6 +23,7 @@ extern "C" {
#include "state_tracker/st_manager.h"
#include "state_tracker/sw_winsys.h"
#include "sw/hgl/hgl_sw_winsys.h"
+#include "util/u_atomic.h"
#include "util/u_memory.h"
#include "target-helpers/inline_sw_helper.h"
@@ -120,6 +120,7 @@ GalliumContext::CreateContext(Bitmap *bitmap)
// Set up the initial things our context needs
context->bitmap = bitmap;
context->colorSpace = get_bitmap_color_space(bitmap);
+ context->screen = fScreen;
context->draw = NULL;
context->read = NULL;
context->st = NULL;
@@ -131,7 +132,7 @@ GalliumContext::CreateContext(Bitmap *bitmap)
}
// Create state_tracker manager
- context->manager = hgl_create_st_manager(fScreen);
+ context->manager = hgl_create_st_manager(context);
// Create state tracker visual
context->stVisual = hgl_create_st_visual(fOptions);
@@ -305,14 +306,14 @@ GalliumContext::SetCurrentContext(Bitmap *bitmap, context_id contextID)
api->make_current(context->api, context->st, context->draw->stfbi,
context->read->stfbi);
- if (context->textures[ST_ATTACHMENT_BACK_LEFT]
- && context->textures[ST_ATTACHMENT_DEPTH_STENCIL]
- && context->postProcess) {
- TRACE("Postprocessing textures...\n");
- pp_init_fbos(context->postProcess,
- context->textures[ST_ATTACHMENT_BACK_LEFT]->width0,
- context->textures[ST_ATTACHMENT_BACK_LEFT]->height0);
- }
+ //if (context->textures[ST_ATTACHMENT_BACK_LEFT]
+ // && context->textures[ST_ATTACHMENT_DEPTH_STENCIL]
+ // && context->postProcess) {
+ // TRACE("Postprocessing textures...\n");
+ // pp_init_fbos(context->postProcess,
+ // context->textures[ST_ATTACHMENT_BACK_LEFT]->width0,
+ // context->textures[ST_ATTACHMENT_BACK_LEFT]->height0);
+ //}
context->bitmap = bitmap;
//context->st->pipe->priv = context;
@@ -369,18 +370,38 @@ GalliumContext::SwapBuffers(context_id contextID)
}
-void
-GalliumContext::ResizeViewport(int32 width, int32 height)
+bool
+GalliumContext::Validate(uint32 width, uint32 height)
{
CALLED();
- for (context_id i = 0; i < CONTEXT_MAX; i++) {
- if (fContext[i] && fContext[i]->st) {
- struct st_context *stContext = (struct st_context*)fContext[i]->st;
- // TODO: _mesa_set_viewport needs to be removed for something st_api?
- _mesa_set_viewport(stContext->ctx, 0, 0, 0, width, height);
- st_manager_validate_framebuffers(stContext);
- }
+
+ if (!fContext[fCurrentContext]) {
+ return false;
+ }
+
+ if (fContext[fCurrentContext]->width != width
+ || fContext[fCurrentContext]->height != height) {
+ Invalidate(width, height);
+ return false;
}
+ return true;
+}
+
+
+void
+GalliumContext::Invalidate(uint32 width, uint32 height)
+{
+ CALLED();
+
+ assert(fContext[fCurrentContext]);
+
+ // Update st_context dimensions
+ fContext[fCurrentContext]->width = width;
+ fContext[fCurrentContext]->height = height;
+
+ // Is this the best way to invalidate?
+ p_atomic_inc(&fContext[fCurrentContext]->read->stfbi->stamp);
+ p_atomic_inc(&fContext[fCurrentContext]->draw->stfbi->stamp);
}
diff --git a/src/gallium/targets/haiku-softpipe/GalliumContext.h b/src/gallium/targets/haiku-softpipe/GalliumContext.h
index 6f8a4d0..b50d528 100644
--- a/src/gallium/targets/haiku-softpipe/GalliumContext.h
+++ b/src/gallium/targets/haiku-softpipe/GalliumContext.h
@@ -40,7 +40,9 @@ public:
context_id contextID);
status_t SwapBuffers(context_id contextID);
- void ResizeViewport(int32 width, int32 height);
+
+ bool Validate(uint32 width, uint32 height);
+ void Invalidate(uint32 width, uint32 height);
private:
status_t CreateScreen();
diff --git a/src/gallium/targets/haiku-softpipe/SoftwareRenderer.cpp b/src/gallium/targets/haiku-softpipe/SoftwareRenderer.cpp
index 77cafd4..18cb1ac 100644
--- a/src/gallium/targets/haiku-softpipe/SoftwareRenderer.cpp
+++ b/src/gallium/targets/haiku-softpipe/SoftwareRenderer.cpp
@@ -54,7 +54,7 @@ SoftwareRenderer::SoftwareRenderer(BGLView *view, ulong options,
CALLED();
// Disable double buffer for the moment.
- options &= ~BGL_DOUBLE;
+ //options &= ~BGL_DOUBLE;
// Initialize the "Haiku Software GL Pipe"
time_t beg;
@@ -72,8 +72,6 @@ SoftwareRenderer::SoftwareRenderer(BGLView *view, ulong options,
fWidth = (GLint)b.IntegerWidth();
fHeight = (GLint)b.IntegerHeight();
- fNewWidth = fWidth;
- fNewHeight = fHeight;
_AllocateBitmap();
@@ -115,19 +113,16 @@ SoftwareRenderer::LockGL()
BAutolock lock(fInfoLocker);
if (fDirectModeEnabled && fInfo != NULL) {
- fNewWidth = fInfo->window_bounds.right - fInfo->window_bounds.left;
- fNewHeight = fInfo->window_bounds.bottom - fInfo->window_bounds.top;
+ fWidth = fInfo->window_bounds.right - fInfo->window_bounds.left;
+ fHeight = fInfo->window_bounds.bottom - fInfo->window_bounds.top;
}
- if (fBitmap && cs == fColorSpace && fNewWidth == fWidth
- && fNewHeight == fHeight) {
+ if (fBitmap && cs == fColorSpace && fContextObj->Validate(fWidth, fHeight)) {
fContextObj->SetCurrentContext(fBitmap, fContextID);
return;
}
fColorSpace = cs;
- fWidth = fNewWidth;
- fHeight = fNewHeight;
_AllocateBitmap();
fContextObj->SetCurrentContext(fBitmap, fContextID);
@@ -329,8 +324,8 @@ SoftwareRenderer::FrameResized(float width, float height)
TRACE("%s: %f x %f\n", __func__, width, height);
BAutolock lock(fInfoLocker);
- fNewWidth = (GLuint)width;
- fNewHeight = (GLuint)height;
+ fWidth = (GLuint)width;
+ fHeight = (GLuint)height;
}
@@ -341,8 +336,9 @@ SoftwareRenderer::_AllocateBitmap()
// allocate new size of back buffer bitmap
BAutolock lock(fInfoLocker);
- delete fBitmap;
- fBitmap = NULL;
+ if (fBitmap)
+ delete fBitmap;
+
if (fWidth < 1 || fHeight < 1) {
TRACE("%s: Can't allocate bitmap of %dx%d\n", __func__,
fWidth, fHeight);
@@ -358,8 +354,6 @@ SoftwareRenderer::_AllocateBitmap()
TRACE("%s: New bitmap size: %" B_PRId32 " x %" B_PRId32 "\n", __func__,
fBitmap->Bounds().IntegerWidth(), fBitmap->Bounds().IntegerHeight());
- fContextObj->ResizeViewport(fWidth, fHeight);
-
#if 0
// debug..
void *data = fBitmap->Bits();
diff --git a/src/gallium/targets/haiku-softpipe/SoftwareRenderer.h b/src/gallium/targets/haiku-softpipe/SoftwareRenderer.h
index 8427ce1..10eaef8 100644
--- a/src/gallium/targets/haiku-softpipe/SoftwareRenderer.h
+++ b/src/gallium/targets/haiku-softpipe/SoftwareRenderer.h
@@ -51,8 +51,6 @@ private:
ulong fOptions;
GLuint fWidth;
GLuint fHeight;
- GLuint fNewWidth;
- GLuint fNewHeight;
color_space fColorSpace;
};
diff --git a/src/gallium/winsys/sw/hgl/hgl_sw_winsys.c b/src/gallium/winsys/sw/hgl/hgl_sw_winsys.c
index 8e8413b..a71d2a7 100644
--- a/src/gallium/winsys/sw/hgl/hgl_sw_winsys.c
+++ b/src/gallium/winsys/sw/hgl/hgl_sw_winsys.c
@@ -1,7 +1,7 @@
/**************************************************************************
*
* Copyright 2009 Artur Wyszynski <harakash at gmail.com>
- * Copyright 2013 Alexander von Gluck IV <kallisti5 at unixzen.com>
+ * Copyright 2013-2014 Alexander von Gluck IV <kallisti5 at unixzen.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
@@ -25,6 +25,7 @@
*
**************************************************************************/
+#include <stdio.h>
#include "pipe/p_compiler.h"
#include "pipe/p_defines.h"
@@ -40,6 +41,16 @@
#include "hgl_sw_winsys.h"
+#ifdef DEBUG
+# define TRACE(x...) printf("hgl:winsys: " x)
+# define CALLED() TRACE("CALLED: %s\n", __PRETTY_FUNCTION__)
+#else
+# define TRACE(x...)
+# define CALLED()
+#endif
+#define ERROR(x...) printf("hgl:winsys: " x)
+
+
struct haiku_displaytarget
{
enum pipe_format format;
@@ -75,7 +86,7 @@ hgl_winsys_is_displaytarget_format_supported(struct sw_winsys* winsys,
unsigned textureUsage, enum pipe_format format)
{
// TODO STUB
- return true;
+ return TRUE;
}
static color_space
@@ -85,8 +96,8 @@ hgl_winsys_convert_cs(enum pipe_format format)
switch(format) {
case PIPE_FORMAT_B5G6R5_UNORM:
return B_CMAP8;
- case PIPE_FORMAT_A8R8G8B8_UNORM:
- case PIPE_FORMAT_X8R8G8B8_UNORM:
+ case PIPE_FORMAT_A8B8G8R8_UNORM:
+ case PIPE_FORMAT_X8B8G8R8_UNORM:
default:
return B_RGB32;
}
@@ -101,6 +112,8 @@ hgl_winsys_displaytarget_create(struct sw_winsys* winsys,
= CALLOC_STRUCT(haiku_displaytarget);
assert(haikuDisplayTarget);
+ TRACE("%s: %d x %d\n", __func__, width, height);
+
haikuDisplayTarget->colorSpace = hgl_winsys_convert_cs(format);
haikuDisplayTarget->format = format;
haikuDisplayTarget->width = width;
@@ -193,6 +206,9 @@ hgl_winsys_displaytarget_display(struct sw_winsys* winsys,
haikuDisplayTarget->size, haikuDisplayTarget->stride,
haikuDisplayTarget->colorSpace);
+ // Dump the rendered bitmap to disk for debugging
+ //dump_bitmap(bitmap);
+
return;
}
--
1.7.1
More information about the mesa-dev
mailing list