wgl: Note down the gallium pixel formats, instead of re-guessing them.
This commit is contained in:
@@ -586,8 +586,8 @@ print_visual_info(HDC hdc, InfoMode mode)
|
||||
if(!DescribePixelFormat(hdc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd))
|
||||
continue;
|
||||
|
||||
if(!(pfd.dwFlags & PFD_SUPPORT_OPENGL))
|
||||
continue;
|
||||
//if(!(pfd.dwFlags & PFD_SUPPORT_OPENGL))
|
||||
// continue;
|
||||
|
||||
++numWglVisuals;
|
||||
}
|
||||
@@ -603,8 +603,8 @@ print_visual_info(HDC hdc, InfoMode mode)
|
||||
if(!DescribePixelFormat(hdc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd))
|
||||
continue;
|
||||
|
||||
if(!(pfd.dwFlags & PFD_SUPPORT_OPENGL))
|
||||
continue;
|
||||
//if(!(pfd.dwFlags & PFD_SUPPORT_OPENGL))
|
||||
// continue;
|
||||
|
||||
if (mode == Verbose)
|
||||
print_visual_attribs_verbose(i, &pfd);
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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 */
|
||||
|
@@ -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.
|
||||
*/
|
||||
colorFormat = pfi->color_format;
|
||||
|
||||
assert(pf_layout( pfi->depth_stencil_format ) == PIPE_FORMAT_LAYOUT_RGBAZS );
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if (visual->depthBits == 0)
|
||||
if(pf_get_component_bits( pfi->depth_stencil_format, PIPE_FORMAT_COMP_Z ))
|
||||
depthFormat = pfi->depth_stencil_format;
|
||||
else
|
||||
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);
|
||||
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)
|
||||
|
@@ -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 );
|
||||
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user