Merge pull request #2064 from jpark37/bgra-swap-chain

D3D swap chain enhancements
master
Jim 2019-10-12 20:54:33 -07:00 committed by GitHub
commit 09c7ec487b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 39 additions and 60 deletions

View File

@ -86,7 +86,7 @@ void OBSQTDisplay::CreateDisplay()
gs_init_data info = {};
info.cx = size.width();
info.cy = size.height();
info.format = GS_RGBA;
info.format = GS_BGRA;
info.zsformat = GS_ZS_NONE;
QTToGSWindow(winId(), info.window);

View File

@ -72,18 +72,41 @@ gs_obj::~gs_obj()
next->prev_next = prev_next;
}
static inline void make_swap_desc(DXGI_SWAP_CHAIN_DESC &desc,
const gs_init_data *data)
static inline void make_swap_desc_common(DXGI_SWAP_CHAIN_DESC &desc,
const gs_init_data *data,
UINT num_backbuffers,
DXGI_SWAP_EFFECT effect)
{
memset(&desc, 0, sizeof(desc));
desc.BufferCount = data->num_backbuffers;
desc.BufferDesc.Format = ConvertGSTextureFormat(data->format);
desc.BufferDesc.Width = data->cx;
desc.BufferDesc.Height = data->cy;
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.OutputWindow = (HWND)data->window.hwnd;
desc.BufferDesc.Format = ConvertGSTextureFormat(data->format);
desc.SampleDesc.Count = 1;
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.BufferCount = num_backbuffers;
desc.OutputWindow = (HWND)data->window.hwnd;
desc.Windowed = true;
desc.SwapEffect = effect;
}
static inline void make_swap_desc_win7(DXGI_SWAP_CHAIN_DESC &desc,
const gs_init_data *data)
{
UINT num_backbuffers = data->num_backbuffers;
if (num_backbuffers == 0)
num_backbuffers = 1;
make_swap_desc_common(desc, data, num_backbuffers,
DXGI_SWAP_EFFECT_DISCARD);
}
static inline void make_swap_desc_win10(DXGI_SWAP_CHAIN_DESC &desc,
const gs_init_data *data)
{
UINT num_backbuffers = data->num_backbuffers;
if (num_backbuffers == 0)
num_backbuffers = 2;
make_swap_desc_common(desc, data, num_backbuffers,
DXGI_SWAP_EFFECT_FLIP_DISCARD);
}
void gs_swap_chain::InitTarget(uint32_t cx, uint32_t cy)
@ -168,11 +191,16 @@ gs_swap_chain::gs_swap_chain(gs_device *device, const gs_init_data *data)
{
HRESULT hr;
make_swap_desc(swapDesc, data);
make_swap_desc_win10(swapDesc, data);
hr = device->factory->CreateSwapChain(device->device, &swapDesc,
swap.Assign());
if (FAILED(hr))
throw HRError("Failed to create swap chain", hr);
if (FAILED(hr)) {
make_swap_desc_win7(swapDesc, data);
hr = device->factory->CreateSwapChain(device->device, &swapDesc,
swap.Assign());
if (FAILED(hr))
throw HRError("Failed to create swap chain", hr);
}
/* Ignore Alt+Enter */
device->factory->MakeWindowAssociation(hwnd, DXGI_MWA_NO_ALT_ENTER);

View File

@ -41,6 +41,7 @@ static inline int get_color_format_bits(enum gs_color_format format)
{
switch ((uint32_t)format) {
case GS_RGBA:
case GS_BGRA:
return 32;
default:
return 0;

View File

@ -95,53 +95,6 @@ struct gl_platform {
GLXPbuffer pbuffer;
};
static void print_info_stuff(const struct gs_init_data *info)
{
blog(LOG_INFO,
"X and Y: %i %i\n"
"Backbuffers: %i\n"
"Color Format: %i\n"
"ZStencil Format: %i\n"
"Adapter: %i\n",
info->cx, info->cy, info->num_backbuffers, info->format,
info->zsformat, info->adapter);
}
/* The following utility functions are copied verbatim from WGL code.
* GLX and WGL are more similar than most people realize. */
/* For now, only support basic 32bit formats for graphics output. */
static inline int get_color_format_bits(enum gs_color_format format)
{
switch ((uint32_t)format) {
case GS_RGBA:
return 32;
default:
return 0;
}
}
static inline int get_depth_format_bits(enum gs_zstencil_format zsformat)
{
switch ((uint32_t)zsformat) {
case GS_Z16:
return 16;
case GS_Z24_S8:
return 24;
default:
return 0;
}
}
static inline int get_stencil_format_bits(enum gs_zstencil_format zsformat)
{
switch ((uint32_t)zsformat) {
case GS_Z24_S8:
return 8;
default:
return 0;
}
}
/*
* Since we cannot take advantage of the asynchronous nature of xcb,
* all of the helper functions are synchronous but thread-safe.

View File

@ -1272,9 +1272,6 @@ gs_swapchain_t *gs_swapchain_create(const struct gs_init_data *data)
if (!gs_valid_p("gs_swapchain_create", data))
return NULL;
if (new_data.num_backbuffers == 0)
new_data.num_backbuffers = 1;
return graphics->exports.device_swapchain_create(graphics->device,
&new_data);
}