diff options
| author | Connor McLaughlin <stenzek@gmail.com> | 2019-03-29 20:40:06 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-03-29 20:40:06 +1000 |
| commit | f3fadd730218429a5f6472283d16d30d7e276f8d (patch) | |
| tree | d1d6577cd52b2d3b3d7872aef4fac80dbd0ce563 /Source/Core/VideoBackends/D3D/Render.cpp | |
| parent | fbe57e8dbef17e583f0ba0208af7bf414a3716bf (diff) | |
| parent | d0d010f8549cc902829f567b3b5127d9a0556ca5 (diff) | |
Merge pull request #7869 from stenzek/d3dcommon
D3D: Move sharable D3D11/D3D12 code to common library
Diffstat (limited to 'Source/Core/VideoBackends/D3D/Render.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/D3D/Render.cpp | 99 |
1 files changed, 41 insertions, 58 deletions
diff --git a/Source/Core/VideoBackends/D3D/Render.cpp b/Source/Core/VideoBackends/D3D/Render.cpp index 82f3cba743..a132efadf3 100644 --- a/Source/Core/VideoBackends/D3D/Render.cpp +++ b/Source/Core/VideoBackends/D3D/Render.cpp @@ -26,6 +26,7 @@ #include "VideoBackends/D3D/DXPipeline.h" #include "VideoBackends/D3D/DXShader.h" #include "VideoBackends/D3D/DXTexture.h" +#include "VideoBackends/D3D/SwapChain.h" #include "VideoCommon/BPFunctions.h" #include "VideoCommon/FramebufferManager.h" @@ -48,11 +49,12 @@ typedef struct _Nv_Stereo_Image_Header #define NVSTEREO_IMAGE_SIGNATURE 0x4433564e -Renderer::Renderer(int backbuffer_width, int backbuffer_height, float backbuffer_scale) - : ::Renderer(backbuffer_width, backbuffer_height, backbuffer_scale, - AbstractTextureFormat::RGBA8) +Renderer::Renderer(std::unique_ptr<SwapChain> swap_chain, float backbuffer_scale) + : ::Renderer(swap_chain ? swap_chain->GetWidth() : 0, swap_chain ? swap_chain->GetHeight() : 0, + backbuffer_scale, + swap_chain ? swap_chain->GetFormat() : AbstractTextureFormat::Undefined), + m_swap_chain(std::move(swap_chain)) { - m_last_fullscreen_state = D3D::GetFullscreenState(); } Renderer::~Renderer() = default; @@ -82,17 +84,13 @@ void Renderer::Create3DVisionTexture(int width, int height) ID3D11Texture2D* texture; HRESULT hr = D3D::device->CreateTexture2D(&texture_desc, &sys_data, &texture); CHECK(SUCCEEDED(hr), "Create 3D Vision Texture"); - m_3d_vision_texture = std::make_unique<DXTexture>(TextureConfig(width * 2, height + 1, 1, 1, 1, - AbstractTextureFormat::RGBA8, - AbstractTextureFlag_RenderTarget), - texture, nullptr, nullptr); - m_3d_vision_framebuffer = - DXFramebuffer::Create(static_cast<DXTexture*>(m_3d_vision_texture.get()), nullptr); + m_3d_vision_texture = DXTexture::CreateAdopted(texture); + m_3d_vision_framebuffer = DXFramebuffer::Create(m_3d_vision_texture.get(), nullptr); } bool Renderer::IsHeadless() const { - return D3D::swapchain == nullptr; + return !m_swap_chain; } std::unique_ptr<AbstractTexture> Renderer::CreateTexture(const TextureConfig& config) @@ -116,13 +114,17 @@ std::unique_ptr<AbstractFramebuffer> Renderer::CreateFramebuffer(AbstractTexture std::unique_ptr<AbstractShader> Renderer::CreateShaderFromSource(ShaderStage stage, const char* source, size_t length) { - return DXShader::CreateFromSource(stage, source, length); + DXShader::BinaryData bytecode; + if (!DXShader::CompileShader(D3D::feature_level, &bytecode, stage, source, length)) + return nullptr; + + return DXShader::CreateFromBytecode(stage, std::move(bytecode)); } std::unique_ptr<AbstractShader> Renderer::CreateShaderFromBinary(ShaderStage stage, const void* data, size_t length) { - return DXShader::CreateFromBinary(stage, data, length); + return DXShader::CreateFromBytecode(stage, DXShader::CreateByteCode(data, length)); } std::unique_ptr<AbstractPipeline> Renderer::CreatePipeline(const AbstractPipelineConfig& config) @@ -196,64 +198,44 @@ void Renderer::DispatchComputeShader(const AbstractShader* shader, u32 groups_x, void Renderer::BindBackbuffer(const ClearColor& clear_color) { - CheckForSurfaceChange(); - CheckForSurfaceResize(); - SetAndClearFramebuffer(D3D::GetSwapChainFramebuffer(), clear_color); + CheckForSwapChainChanges(); + SetAndClearFramebuffer(m_swap_chain->GetFramebuffer(), clear_color); } void Renderer::PresentBackbuffer() { - D3D::Present(); + m_swap_chain->Present(); } void Renderer::OnConfigChanged(u32 bits) { + // Quad-buffer changes require swap chain recreation. + if (bits & CONFIG_CHANGE_BIT_STEREO_MODE && m_swap_chain) + m_swap_chain->SetStereo(SwapChain::WantsStereo()); } -void Renderer::CheckForSurfaceChange() -{ - if (!m_surface_changed.TestAndClear()) - return; - - m_3d_vision_framebuffer.reset(); - m_3d_vision_texture.reset(); - - D3D::Reset(reinterpret_cast<HWND>(m_new_surface_handle)); - m_new_surface_handle = nullptr; - - UpdateBackbufferSize(); -} - -void Renderer::CheckForSurfaceResize() +void Renderer::CheckForSwapChainChanges() { - const bool fullscreen_state = D3D::GetFullscreenState(); - const bool exclusive_fullscreen_changed = fullscreen_state != m_last_fullscreen_state; - if (!m_surface_resized.TestAndClear() && !exclusive_fullscreen_changed) + const bool surface_changed = m_surface_changed.TestAndClear(); + const bool surface_resized = + m_surface_resized.TestAndClear() || m_swap_chain->CheckForFullscreenChange(); + if (!surface_changed && !surface_resized) return; - m_3d_vision_framebuffer.reset(); - m_3d_vision_texture.reset(); - - m_last_fullscreen_state = fullscreen_state; - if (D3D::swapchain) - D3D::ResizeSwapChain(); - UpdateBackbufferSize(); -} - -void Renderer::UpdateBackbufferSize() -{ - if (D3D::swapchain) + if (surface_changed) { - DXGI_SWAP_CHAIN_DESC1 desc = {}; - D3D::swapchain->GetDesc1(&desc); - m_backbuffer_width = std::max(desc.Width, 1u); - m_backbuffer_height = std::max(desc.Height, 1u); + m_swap_chain->ChangeSurface(m_new_surface_handle); + m_new_surface_handle = nullptr; } else { - m_backbuffer_width = 1; - m_backbuffer_height = 1; + m_swap_chain->ResizeSwapChain(); } + + m_backbuffer_width = m_swap_chain->GetWidth(); + m_backbuffer_height = m_swap_chain->GetHeight(); + m_3d_vision_framebuffer.reset(); + m_3d_vision_texture.reset(); } void Renderer::SetFramebuffer(AbstractFramebuffer* framebuffer) @@ -363,22 +345,23 @@ void Renderer::RenderXFBToScreen(const AbstractTexture* texture, const EFBRectan // Copy the left eye to the backbuffer, if Nvidia 3D Vision is enabled it should // recognize the signature and automatically include the right eye frame. - const CD3D11_BOX box(0, 0, 0, m_backbuffer_width, m_backbuffer_height, 1); - D3D::context->CopySubresourceRegion(D3D::GetSwapChainTexture()->GetD3DTexture(), 0, 0, 0, 0, + const CD3D11_BOX box(0, 0, 0, m_swap_chain->GetWidth(), m_swap_chain->GetHeight(), 1); + D3D::context->CopySubresourceRegion(m_swap_chain->GetTexture()->GetD3DTexture(), 0, 0, 0, 0, m_3d_vision_texture->GetD3DTexture(), 0, &box); // Restore render target to backbuffer - SetFramebuffer(D3D::GetSwapChainFramebuffer()); + SetFramebuffer(m_swap_chain->GetFramebuffer()); } void Renderer::SetFullscreen(bool enable_fullscreen) { - D3D::SetFullscreenState(enable_fullscreen); + if (m_swap_chain) + m_swap_chain->SetFullscreen(enable_fullscreen); } bool Renderer::IsFullscreen() const { - return D3D::GetFullscreenState(); + return m_swap_chain && m_swap_chain->GetFullscreen(); } } // namespace DX11 |
