summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJosé Fonseca <[email protected]>2009-04-10 18:43:51 +0100
committerJosé Fonseca <[email protected]>2009-04-10 19:50:35 +0100
commit6fc244c68d3b3a9f89b6f752725e6c768cb08a84 (patch)
tree73ba46fbdbf1edf80af5cb42c83a08cbf6452a63 /src
parentaa405a2a77d51a4f807c5c2f63cbc76eb660e489 (diff)
wgl: Note down the gallium pixel formats, instead of re-guessing them.
Diffstat (limited to 'src')
-rw-r--r--src/gallium/state_trackers/wgl/shared/stw_context.c3
-rw-r--r--src/gallium/state_trackers/wgl/shared/stw_context.h2
-rw-r--r--src/gallium/state_trackers/wgl/shared/stw_framebuffer.c94
-rw-r--r--src/gallium/state_trackers/wgl/shared/stw_framebuffer.h3
-rw-r--r--src/gallium/state_trackers/wgl/shared/stw_pixelformat.c12
-rw-r--r--src/gallium/state_trackers/wgl/shared/stw_pixelformat.h4
6 files changed, 34 insertions, 84 deletions
diff --git a/src/gallium/state_trackers/wgl/shared/stw_context.c b/src/gallium/state_trackers/wgl/shared/stw_context.c
index e6bb8e18472..1e3bf103176 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_context.c
+++ b/src/gallium/state_trackers/wgl/shared/stw_context.c
@@ -153,6 +153,7 @@ stw_create_layer_context(
goto fail;
ctx->st->ctx->DriverCtx = ctx;
+ ctx->pfi = pf;
pipe_mutex_lock( stw_dev->mutex );
hglrc = handle_table_add(stw_dev->ctx_table, ctx);
@@ -330,7 +331,7 @@ stw_make_current(
if (fb == NULL && ctx != NULL && hdc != NULL) {
GLvisual *visual = &ctx->st->ctx->Visual;
- fb = stw_framebuffer_create( hdc, visual, width, height );
+ fb = stw_framebuffer_create( hdc, visual, ctx->pfi, width, height );
if (fb == NULL)
return FALSE;
}
diff --git a/src/gallium/state_trackers/wgl/shared/stw_context.h b/src/gallium/state_trackers/wgl/shared/stw_context.h
index b2896152724..bc3b1dc880d 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_context.h
+++ b/src/gallium/state_trackers/wgl/shared/stw_context.h
@@ -31,12 +31,14 @@
#include <windows.h>
struct st_context;
+struct stw_pixelformat_info;
struct stw_context
{
struct st_context *st;
HDC hdc;
DWORD color_bits;
+ const struct stw_pixelformat_info *pfi;
};
#endif /* STW_CONTEXT_H */
diff --git a/src/gallium/state_trackers/wgl/shared/stw_framebuffer.c b/src/gallium/state_trackers/wgl/shared/stw_framebuffer.c
index 55dc9d678c1..e70e20390e1 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_framebuffer.c
+++ b/src/gallium/state_trackers/wgl/shared/stw_framebuffer.c
@@ -93,21 +93,6 @@ stw_call_window_proc(
return CallNextHookEx(tls_data->hCallWndProcHook, nCode, wParam, lParam);
}
-static INLINE boolean
-stw_is_supported_color(enum pipe_format format)
-{
- struct pipe_screen *screen = stw_dev->screen;
- return screen->is_format_supported(screen, format, PIPE_TEXTURE_2D,
- PIPE_TEXTURE_USAGE_RENDER_TARGET, 0);
-}
-
-static INLINE boolean
-stw_is_supported_depth_stencil(enum pipe_format format)
-{
- struct pipe_screen *screen = stw_dev->screen;
- return screen->is_format_supported(screen, format, PIPE_TEXTURE_2D,
- PIPE_TEXTURE_USAGE_DEPTH_STENCIL, 0);
-}
/* Create a new framebuffer object which will correspond to the given HDC.
*/
@@ -115,83 +100,26 @@ struct stw_framebuffer *
stw_framebuffer_create(
HDC hdc,
GLvisual *visual,
+ const struct stw_pixelformat_info *pfi,
GLuint width,
GLuint height )
{
- struct stw_framebuffer *fb;
enum pipe_format colorFormat, depthFormat, stencilFormat;
+ struct stw_framebuffer *fb;
- /* Determine PIPE_FORMATs for buffers.
- */
-
- if(visual->alphaBits <= 0 && visual->redBits <= 5 && visual->blueBits <= 6 && visual->greenBits <= 5 &&
- stw_is_supported_color(PIPE_FORMAT_R5G6B5_UNORM)) {
- colorFormat = PIPE_FORMAT_R5G6B5_UNORM;
- }
- else if(visual->alphaBits <= 0 && visual->redBits <= 8 && visual->blueBits <= 8 && visual->greenBits <= 8 &&
- stw_is_supported_color(PIPE_FORMAT_X8R8G8B8_UNORM)) {
- colorFormat = PIPE_FORMAT_X8R8G8B8_UNORM;
- }
- else if(visual->alphaBits <= 1 && visual->redBits <= 5 && visual->blueBits <= 5 && visual->greenBits <= 5 &&
- stw_is_supported_color(PIPE_FORMAT_A1R5G5B5_UNORM)) {
- colorFormat = PIPE_FORMAT_A1R5G5B5_UNORM;
- }
- else if(visual->alphaBits <= 4 && visual->redBits <= 4 && visual->blueBits <= 4 && visual->greenBits <= 4 &&
- stw_is_supported_color(PIPE_FORMAT_A4R4G4B4_UNORM)) {
- colorFormat = PIPE_FORMAT_A4R4G4B4_UNORM;
- }
- else if(visual->alphaBits <= 8 && visual->redBits <= 8 && visual->blueBits <= 8 && visual->greenBits <= 8 &&
- stw_is_supported_color(PIPE_FORMAT_A8R8G8B8_UNORM)) {
- colorFormat = PIPE_FORMAT_A8R8G8B8_UNORM;
- }
- else {
- assert(0);
- return NULL;
- }
+ colorFormat = pfi->color_format;
+
+ assert(pf_layout( pfi->depth_stencil_format ) == PIPE_FORMAT_LAYOUT_RGBAZS );
- if (visual->depthBits == 0)
- depthFormat = PIPE_FORMAT_NONE;
- else if (visual->depthBits <= 16 &&
- stw_is_supported_depth_stencil(PIPE_FORMAT_Z16_UNORM))
- depthFormat = PIPE_FORMAT_Z16_UNORM;
- else if (visual->depthBits <= 24 && visual->stencilBits != 8 &&
- stw_is_supported_depth_stencil(PIPE_FORMAT_X8Z24_UNORM)) {
- depthFormat = PIPE_FORMAT_X8Z24_UNORM;
- }
- else if (visual->depthBits <= 24 && visual->stencilBits != 8 &&
- stw_is_supported_depth_stencil(PIPE_FORMAT_Z24X8_UNORM)) {
- depthFormat = PIPE_FORMAT_Z24X8_UNORM;
- }
- else if (visual->depthBits <= 24 && visual->stencilBits == 8 &&
- stw_is_supported_depth_stencil(PIPE_FORMAT_S8Z24_UNORM)) {
- depthFormat = PIPE_FORMAT_S8Z24_UNORM;
- }
- else if (visual->depthBits <= 24 && visual->stencilBits == 8 &&
- stw_is_supported_depth_stencil(PIPE_FORMAT_Z24S8_UNORM)) {
- depthFormat = PIPE_FORMAT_Z24S8_UNORM;
- }
- else if(stw_is_supported_depth_stencil(PIPE_FORMAT_Z32_UNORM)) {
- depthFormat = PIPE_FORMAT_Z32_UNORM;
- }
- else if(stw_is_supported_depth_stencil(PIPE_FORMAT_Z32_FLOAT)) {
- depthFormat = PIPE_FORMAT_Z32_FLOAT;
- }
- else {
- assert(0);
+ if(pf_get_component_bits( pfi->depth_stencil_format, PIPE_FORMAT_COMP_Z ))
+ depthFormat = pfi->depth_stencil_format;
+ else
depthFormat = PIPE_FORMAT_NONE;
- }
- if (depthFormat == PIPE_FORMAT_S8Z24_UNORM ||
- depthFormat == PIPE_FORMAT_Z24S8_UNORM) {
- stencilFormat = depthFormat;
- }
- else if (visual->stencilBits == 8 &&
- stw_is_supported_depth_stencil(PIPE_FORMAT_S8_UNORM)) {
- stencilFormat = PIPE_FORMAT_S8_UNORM;
- }
- else {
+ if(pf_get_component_bits( pfi->depth_stencil_format, PIPE_FORMAT_COMP_S ))
+ stencilFormat = pfi->depth_stencil_format;
+ else
stencilFormat = PIPE_FORMAT_NONE;
- }
fb = CALLOC_STRUCT( stw_framebuffer );
if (fb == NULL)
diff --git a/src/gallium/state_trackers/wgl/shared/stw_framebuffer.h b/src/gallium/state_trackers/wgl/shared/stw_framebuffer.h
index ea3bf6f8fc7..607b7f0ef2a 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_framebuffer.h
+++ b/src/gallium/state_trackers/wgl/shared/stw_framebuffer.h
@@ -30,6 +30,8 @@
#include "main/mtypes.h"
+struct stw_pixelformat_info;
+
/**
* Windows framebuffer, derived from gl_framebuffer.
*/
@@ -45,6 +47,7 @@ struct stw_framebuffer *
stw_framebuffer_create(
HDC hdc,
GLvisual *visual,
+ const struct stw_pixelformat_info *pfi,
GLuint width,
GLuint height );
diff --git a/src/gallium/state_trackers/wgl/shared/stw_pixelformat.c b/src/gallium/state_trackers/wgl/shared/stw_pixelformat.c
index 897478e0f5b..67a92d3d8ec 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_pixelformat.c
+++ b/src/gallium/state_trackers/wgl/shared/stw_pixelformat.c
@@ -128,11 +128,23 @@ stw_pixelformat_add(
assert(stw_dev->pixelformat_extended_count < STW_MAX_PIXELFORMATS);
if(stw_dev->pixelformat_extended_count >= STW_MAX_PIXELFORMATS)
return;
+
+ assert(pf_layout( color->format ) == PIPE_FORMAT_LAYOUT_RGBAZS );
+ assert(pf_get_component_bits( color->format, PIPE_FORMAT_COMP_R ) == color->bits.red );
+ assert(pf_get_component_bits( color->format, PIPE_FORMAT_COMP_G ) == color->bits.green );
+ assert(pf_get_component_bits( color->format, PIPE_FORMAT_COMP_B ) == color->bits.blue );
+ assert(pf_get_component_bits( color->format, PIPE_FORMAT_COMP_A ) == color->bits.alpha );
+ assert(pf_layout( depth->format ) == PIPE_FORMAT_LAYOUT_RGBAZS );
+ assert(pf_get_component_bits( depth->format, PIPE_FORMAT_COMP_Z ) == depth->bits.depth );
+ assert(pf_get_component_bits( depth->format, PIPE_FORMAT_COMP_S ) == depth->bits.stencil );
pfi = &stw_dev->pixelformats[stw_dev->pixelformat_extended_count];
memset(pfi, 0, sizeof *pfi);
+ pfi->color_format = color->format;
+ pfi->depth_stencil_format = depth->format;
+
pfi->pfd.nSize = sizeof pfi->pfd;
pfi->pfd.nVersion = 1;
diff --git a/src/gallium/state_trackers/wgl/shared/stw_pixelformat.h b/src/gallium/state_trackers/wgl/shared/stw_pixelformat.h
index acfb230d9d0..34522ebef38 100644
--- a/src/gallium/state_trackers/wgl/shared/stw_pixelformat.h
+++ b/src/gallium/state_trackers/wgl/shared/stw_pixelformat.h
@@ -31,9 +31,13 @@
#include <windows.h>
#include "pipe/p_compiler.h"
+#include "pipe/p_format.h"
struct stw_pixelformat_info
{
+ enum pipe_format color_format;
+ enum pipe_format depth_stencil_format;
+
PIXELFORMATDESCRIPTOR pfd;
unsigned numSampleBuffers;