diff --git a/gfx/common/d3d11_common.c b/gfx/common/d3d11_common.c index 3cda332f69..6f5bd87e62 100644 --- a/gfx/common/d3d11_common.c +++ b/gfx/common/d3d11_common.c @@ -58,6 +58,7 @@ HRESULT WINAPI D3D11CreateDeviceAndSwapChain( void d3d11_init_texture(D3D11Device device, d3d11_texture_t* texture) { bool is_render_target = texture->desc.BindFlags & D3D11_BIND_RENDER_TARGET; + UINT format_support = D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE; d3d11_release_texture(texture); @@ -65,7 +66,7 @@ void d3d11_init_texture(D3D11Device device, d3d11_texture_t* texture) texture->desc.ArraySize = 1; texture->desc.SampleDesc.Count = 1; texture->desc.SampleDesc.Quality = 0; - texture->desc.BindFlags |= D3D11_BIND_SHADER_RESOURCE; + texture->desc.BindFlags |= D3D11_BIND_SHADER_RESOURCE; texture->desc.CPUAccessFlags = texture->desc.Usage == D3D11_USAGE_DYNAMIC ? D3D11_CPU_ACCESS_WRITE : 0; @@ -82,6 +83,11 @@ void d3d11_init_texture(D3D11Device device, d3d11_texture_t* texture) } } + if (texture->desc.BindFlags & D3D11_BIND_RENDER_TARGET) + format_support |= D3D11_FORMAT_SUPPORT_RENDER_TARGET; + + texture->desc.Format = d3d11_get_closest_match(device, texture->desc.Format, format_support); + D3D11CreateTexture2D(device, &texture->desc, NULL, &texture->handle); { @@ -197,9 +203,12 @@ bool d3d11_init_shader( { D3D11CreateVertexShader( device, D3DGetBufferPointer(vs_code), D3DGetBufferSize(vs_code), NULL, &out->vs); - D3D11CreateInputLayout( - device, input_element_descs, num_elements, D3DGetBufferPointer(vs_code), - D3DGetBufferSize(vs_code), &out->layout); + + if (input_element_descs) + D3D11CreateInputLayout( + device, input_element_descs, num_elements, D3DGetBufferPointer(vs_code), + D3DGetBufferSize(vs_code), &out->layout); + Release(vs_code); } @@ -207,6 +216,7 @@ bool d3d11_init_shader( { D3D11CreatePixelShader( device, D3DGetBufferPointer(ps_code), D3DGetBufferSize(ps_code), NULL, &out->ps); + Release(ps_code); } @@ -214,6 +224,7 @@ bool d3d11_init_shader( { D3D11CreateGeometryShader( device, D3DGetBufferPointer(gs_code), D3DGetBufferSize(gs_code), NULL, &out->gs); + Release(gs_code); } diff --git a/gfx/common/d3d11_common.h b/gfx/common/d3d11_common.h index e52cbabd8f..52a0ed334d 100644 --- a/gfx/common/d3d11_common.h +++ b/gfx/common/d3d11_common.h @@ -2587,14 +2587,6 @@ void d3d11_update_texture( DXGI_FORMAT d3d11_get_closest_match( D3D11Device device, DXGI_FORMAT desired_format, UINT desired_format_support); -static INLINE DXGI_FORMAT -d3d11_get_closest_match_texture2D(D3D11Device device, DXGI_FORMAT desired_format) -{ - return d3d11_get_closest_match( - device, desired_format, - D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE); -} - bool d3d11_init_shader( D3D11Device device, const char* src, diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index 5fcd0d79eb..5ef8283489 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -280,16 +280,16 @@ static bool d3d11_gfx_set_shader(void* data, enum rarch_shader_type type, const for (int i = 0; i < d3d11->shader_preset->luts; i++) { struct texture_image image = { 0 }; + image.supports_rgba = true; if (!image_texture_load(&image, d3d11->shader_preset->lut[i].path)) goto error; d3d11->luts[i].desc.Width = image.width; d3d11->luts[i].desc.Height = image.height; - d3d11->luts[i].desc.Format = - d3d11_get_closest_match_texture2D(d3d11->device, DXGI_FORMAT_B8G8R8A8_UNORM); + d3d11->luts[i].desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; d3d11_init_texture(d3d11->device, &d3d11->luts[i]); d3d11_update_texture( - d3d11->ctx, image.width, image.height, 0, DXGI_FORMAT_B8G8R8A8_UNORM, image.pixels, + d3d11->ctx, image.width, image.height, 0, DXGI_FORMAT_R8G8B8A8_UNORM, image.pixels, &d3d11->luts[i]); image_texture_free(&image); @@ -446,9 +446,8 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i d3d11->vsync = video->vsync; d3d11->format = video->rgb32 ? DXGI_FORMAT_B8G8R8X8_UNORM : DXGI_FORMAT_B5G6R5_UNORM; - d3d11->frame.texture.desc.Format = - d3d11_get_closest_match_texture2D(d3d11->device, d3d11->format); - d3d11->frame.texture.desc.Usage = D3D11_USAGE_DEFAULT; + d3d11->frame.texture.desc.Format = d3d11->format; + d3d11->frame.texture.desc.Usage = D3D11_USAGE_DEFAULT; d3d11->menu.texture.desc.Usage = D3D11_USAGE_DEFAULT; @@ -751,13 +750,10 @@ static bool d3d11_init_frame_textures(d3d11_video_t* d3d11, unsigned width, unsi d3d11->pass[i].rt.desc.Width = width; d3d11->pass[i].rt.desc.Height = height; d3d11->pass[i].rt.desc.BindFlags = D3D11_BIND_RENDER_TARGET; - d3d11->pass[i].rt.desc.Format = d3d11_get_closest_match( - d3d11->device, - pass->fbo.fp_fbo ? DXGI_FORMAT_R32G32B32A32_FLOAT - : pass->fbo.srgb_fbo ? DXGI_FORMAT_R8G8B8A8_UNORM_SRGB - : DXGI_FORMAT_R8G8B8A8_UNORM, - D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE | - D3D11_FORMAT_SUPPORT_RENDER_TARGET); + d3d11->pass[i].rt.desc.Format = pass->fbo.fp_fbo ? DXGI_FORMAT_R32G32B32A32_FLOAT + : pass->fbo.srgb_fbo + ? DXGI_FORMAT_R8G8B8A8_UNORM_SRGB + : DXGI_FORMAT_R8G8B8A8_UNORM; if ((i != (d3d11->shader_preset->passes - 1)) || (width != d3d11->vp.width) || (height != d3d11->vp.height)) @@ -1045,7 +1041,7 @@ static void d3d11_set_menu_texture_frame( if (d3d11->menu.texture.desc.Width != width || d3d11->menu.texture.desc.Height != height) { - d3d11->menu.texture.desc.Format = d3d11_get_closest_match_texture2D(d3d11->device, format); + d3d11->menu.texture.desc.Format = format; d3d11->menu.texture.desc.Width = width; d3d11->menu.texture.desc.Height = height; d3d11_init_texture(d3d11->device, &d3d11->menu.texture); @@ -1129,8 +1125,7 @@ static uintptr_t d3d11_gfx_load_texture( texture->desc.Width = image->width; texture->desc.Height = image->height; - texture->desc.Format = - d3d11_get_closest_match_texture2D(d3d11->device, DXGI_FORMAT_B8G8R8A8_UNORM); + texture->desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; d3d11_init_texture(d3d11->device, texture); diff --git a/gfx/drivers_font/d3d11_font.c b/gfx/drivers_font/d3d11_font.c index fd3e36d987..09f6c36b83 100644 --- a/gfx/drivers_font/d3d11_font.c +++ b/gfx/drivers_font/d3d11_font.c @@ -54,8 +54,7 @@ d3d11_font_init_font(void* data, const char* font_path, float font_size, bool is font->texture.sampler = d3d11->sampler_linear; font->texture.desc.Width = font->atlas->width; font->texture.desc.Height = font->atlas->height; - font->texture.desc.Format = - d3d11_get_closest_match_texture2D(d3d11->device, DXGI_FORMAT_A8_UNORM); + font->texture.desc.Format = DXGI_FORMAT_A8_UNORM; d3d11_init_texture(d3d11->device, &font->texture); d3d11_update_texture( d3d11->ctx, font->atlas->width, font->atlas->height, font->atlas->width,