diff --git a/GPU/D3D11/StateMappingD3D11.cpp b/GPU/D3D11/StateMappingD3D11.cpp index edf023ae92..6742dae7a2 100644 --- a/GPU/D3D11/StateMappingD3D11.cpp +++ b/GPU/D3D11/StateMappingD3D11.cpp @@ -30,6 +30,7 @@ #include "GPU/Common/FramebufferCommon.h" #include "GPU/D3D11/DrawEngineD3D11.h" #include "GPU/D3D11/FramebufferManagerD3D11.h" +#include "GPU/D3D11/TextureCacheD3D11.h" // These tables all fit into u8s. static const D3D11_BLEND d3d11BlendFactorLookup[(size_t)BlendFactor::COUNT] = { @@ -185,8 +186,6 @@ struct D3D11DynamicState { }; void ConvertStateToKeys(FramebufferManagerCommon *fbManager, ShaderManagerD3D11 *shaderManager, int prim, D3D11StateKeys &key, D3D11DynamicState &dynState) { - memset(&key, 0, sizeof(key)); - memset(&dynState, 0, sizeof(dynState)); // Unfortunately, this isn't implemented yet. gstate_c.allowShaderBlend = false; @@ -383,8 +382,18 @@ void ConvertStateToKeys(FramebufferManagerCommon *fbManager, ShaderManagerD3D11 } void DrawEngineD3D11::ApplyDrawState(int prim) { - D3D11StateKeys keys; - D3D11DynamicState dynState; + if (gstate_c.IsDirty(DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS) && !gstate.isModeClear() && gstate.isTextureMapEnabled()) { + textureCache_->SetTexture(); + gstate_c.Clean(DIRTY_TEXTURE_IMAGE | DIRTY_TEXTURE_PARAMS); + if (gstate_c.needShaderTexClamp) { + // We will rarely need to set this, so let's do it every time on use rather than in runloop. + // Most of the time non-framebuffer textures will be used which can be clamped themselves. + gstate_c.Dirty(DIRTY_TEXCLAMP); + } + } + + D3D11StateKeys keys{}; + D3D11DynamicState dynState{}; ConvertStateToKeys(framebufferManager_, shaderManager_, prim, keys, dynState); uint32_t blendKey, depthKey, rasterKey; @@ -435,6 +444,7 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { } void DrawEngineD3D11::ApplyDrawStateLate(bool applyStencilRef, uint8_t stencilRef) { + textureCache_->ApplyTexture(); if (applyStencilRef) { // context_->OMSetDepthStencilState(state, stencilRef); } diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index 3344a03daa..60972a6bf0 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -132,7 +132,7 @@ void TextureCacheD3D11::SetFramebufferManager(FramebufferManagerD3D11 *fbManager } void TextureCacheD3D11::Clear(bool delete_them) { - context_->PSSetShaderResources(0, 1, nullptr); + // context_->PSSetShaderResources(0, 1, nullptr); lastBoundTexture = INVALID_TEX; if (delete_them) { for (TexCache::iterator iter = cache.begin(); iter != cache.end(); ++iter) { @@ -1113,7 +1113,9 @@ void TextureCacheD3D11::LoadTextureLevel(TexCacheEntry &entry, ReplacedTexture & desc.SampleDesc.Count = 1; desc.Width = tw; desc.Height = th; + desc.Format = tfmt; desc.MipLevels = levels; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; HRESULT hr = device_->CreateTexture2D(&desc, nullptr, &texture); if (FAILED(hr)) { diff --git a/GPU/Directx9/VertexShaderGeneratorDX9.cpp b/GPU/Directx9/VertexShaderGeneratorDX9.cpp index 7293f88ea1..15cd493a68 100644 --- a/GPU/Directx9/VertexShaderGeneratorDX9.cpp +++ b/GPU/Directx9/VertexShaderGeneratorDX9.cpp @@ -276,13 +276,25 @@ void GenerateVertexShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage l if (enableFog) { WRITE(p, " Out.v_fogdepth.x = In.position.w;\n"); } - if (gstate.isModeThrough()) { - WRITE(p, " Out.gl_Position = mul(float4(In.position.xyz, 1.0), u_proj_through);\n"); - } else { - if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " Out.gl_Position = depthRoundZVP(mul(float4(In.position.xyz, 1.0), u_proj));\n"); + if (lang == HLSL_D3D11) { + if (gstate.isModeThrough()) { + WRITE(p, " Out.gl_Position = mul(u_proj_through, float4(In.position.xyz, 1.0));\n"); } else { - WRITE(p, " Out.gl_Position = mul(float4(In.position.xyz, 1.0), u_proj);\n"); + if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { + WRITE(p, " Out.gl_Position = depthRoundZVP(mul(u_proj, float4(In.position.xyz, 1.0)));\n"); + } else { + WRITE(p, " Out.gl_Position = mul(u_proj, float4(In.position.xyz, 1.0));\n"); + } + } + } else { + if (gstate.isModeThrough()) { + WRITE(p, " Out.gl_Position = mul(float4(In.position.xyz, 1.0), u_proj_through);\n"); + } else { + if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { + WRITE(p, " Out.gl_Position = depthRoundZVP(mul(float4(In.position.xyz, 1.0), u_proj));\n"); + } else { + WRITE(p, " Out.gl_Position = mul(float4(In.position.xyz, 1.0), u_proj);\n"); + } } } } else { @@ -290,14 +302,18 @@ void GenerateVertexShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage l if (!enableBones) { // No skinning, just standard T&L. if (lang == HLSL_D3D11) { - WRITE(p, " float3 worldpos = mul(float4(In.position.xyz, 1.0), u_world).xyz;\n"); + WRITE(p, " float3 worldpos = mul(u_world, float4(In.position.xyz, 1.0)).xyz;\n"); + if (hasNormal) + WRITE(p, " float3 worldnormal = normalize( mul(u_world, float4(%sIn.normal, 0.0)));\n", flipNormal ? "-" : ""); + else + WRITE(p, " float3 worldnormal = float3(0.0, 0.0, 1.0);\n"); } else { WRITE(p, " float3 worldpos = mul(float4(In.position.xyz, 1.0), u_world);\n"); + if (hasNormal) + WRITE(p, " float3 worldnormal = normalize( mul(float4(%sIn.normal, 0.0), u_world));\n", flipNormal ? "-" : ""); + else + WRITE(p, " float3 worldnormal = float3(0.0, 0.0, 1.0);\n"); } - if (hasNormal) - WRITE(p, " float3 worldnormal = normalize( mul(float4(%sIn.normal, 0.0), u_world));\n", flipNormal ? "-" : ""); - else - WRITE(p, " float3 worldnormal = float3(0.0, 0.0, 1.0);\n"); } else { static const char * const boneWeightAttr[8] = { "a_w1.x", "a_w1.y", "a_w1.z", "a_w1.w", @@ -372,16 +388,23 @@ void GenerateVertexShaderHLSL(const ShaderID &id, char *buffer, ShaderLanguage l } if (lang == HLSL_D3D11) { - WRITE(p, " float4 viewPos = mul(float4(worldpos, 1.0), u_view);\n"); + WRITE(p, " float4 viewPos = mul(u_view, float4(worldpos, 1.0));\n"); + + // Final view and projection transforms. + if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { + WRITE(p, " Out.gl_Position = depthRoundZVP(mul(u_proj, viewPos));\n"); + } else { + WRITE(p, " Out.gl_Position = mul(u_proj, viewPos);\n"); + } } else { WRITE(p, " float4 viewPos = float4(mul(float4(worldpos, 1.0), u_view), 1.0);\n"); - } - // Final view and projection transforms. - if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " Out.gl_Position = depthRoundZVP(mul(viewPos, u_proj));\n"); - } else { - WRITE(p, " Out.gl_Position = mul(viewPos, u_proj);\n"); + // Final view and projection transforms. + if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { + WRITE(p, " Out.gl_Position = depthRoundZVP(mul(viewPos, u_proj));\n"); + } else { + WRITE(p, " Out.gl_Position = mul(viewPos, u_proj);\n"); + } } // TODO: Declare variables for dots for shade mapping if needed. diff --git a/Windows/GPU/D3D11Context.cpp b/Windows/GPU/D3D11Context.cpp index ad6ef6c90f..c0288a6ada 100644 --- a/Windows/GPU/D3D11Context.cpp +++ b/Windows/GPU/D3D11Context.cpp @@ -74,11 +74,9 @@ bool D3D11Context::Init(HINSTANCE hInst, HWND wnd, std::string *error_message) { return false; #ifdef _DEBUG - if (SUCCEEDED(device_->QueryInterface(__uuidof(ID3D11Debug), (void**)&d3dDebug_))) - { + if (SUCCEEDED(device_->QueryInterface(__uuidof(ID3D11Debug), (void**)&d3dDebug_))) { ID3D11InfoQueue *d3dInfoQueue = nullptr; - if (SUCCEEDED(d3dDebug_->QueryInterface(__uuidof(ID3D11InfoQueue), (void**)&d3dInfoQueue))) - { + if (SUCCEEDED(d3dDebug_->QueryInterface(__uuidof(ID3D11InfoQueue), (void**)&d3dInfoQueue))) { d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, true); d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, true); d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_WARNING, true); @@ -92,6 +90,7 @@ bool D3D11Context::Init(HINSTANCE hInst, HWND wnd, std::string *error_message) { void D3D11Context::Resize() { draw_->HandleEvent(Draw::Event::LOST_BACKBUFFER); + draw_->HandleEvent(Draw::Event::RESIZED); // This should only be called from the emu thread. /* int xres, yres; @@ -99,12 +98,11 @@ void D3D11Context::Resize() { bool w_changed = pp.BackBufferWidth != xres; bool h_changed = pp.BackBufferHeight != yres; - if (device && (w_changed || h_changed)) { + if (device_ && (w_changed || h_changed)) { pp.BackBufferWidth = xres; pp.BackBufferHeight = yres; HRESULT hr = device_->Reset(&pp); if (FAILED(hr)) { - // Had to remove DXGetErrorStringA calls here because dxerr.lib is deprecated and will not link with VS 2015. ERROR_LOG_REPORT(G3D, "Unable to reset D3D device"); PanicAlert("Unable to reset D3D11 device"); } diff --git a/ext/native/thin3d/thin3d.h b/ext/native/thin3d/thin3d.h index d3f49fe2db..f58c618704 100644 --- a/ext/native/thin3d/thin3d.h +++ b/ext/native/thin3d/thin3d.h @@ -347,6 +347,7 @@ enum class Event { // These happen on D3D resize LOST_BACKBUFFER, GOT_BACKBUFFER, + RESIZED, PRESENT_REQUESTED, };