diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 03666ff0f3..e0dca3b3cc 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -978,7 +978,6 @@ void FramebufferManagerCommon::DrawPixels(VirtualFramebuffer *vfb, int dstX, int Draw::Texture *pixelsTex = MakePixelTexture(srcPixels, srcPixelFormat, srcStride, width, height); if (pixelsTex) { draw_->BindTextures(0, 1, &pixelsTex); - Bind2DShader(); DrawActiveTexture(dstX, dstY, width, height, vfb->bufferWidth, vfb->bufferHeight, u0, v0, u1, v1, ROTATION_LOCKED_HORIZONTAL, flags); gpuStats.numUploads++; pixelsTex->Release(); diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 2f09440b56..f0b981ec1d 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -353,7 +353,6 @@ protected: void SetViewport2D(int x, int y, int w, int h); Draw::Texture *MakePixelTexture(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height); void DrawActiveTexture(float x, float y, float w, float h, float destW, float destH, float u0, float v0, float u1, float v1, int uvRotation, int flags); - virtual void Bind2DShader() = 0; void DrawStrip2D(Draw::Texture *tex, Draw2DVertex *verts, int vertexCount, bool linearFilter); diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index a53aea9540..982e0f7eeb 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -43,65 +43,16 @@ #include #endif -static const char *vscode = - "struct VS_IN {\n" - " float4 ObjPos : POSITION;\n" - " float2 Uv : TEXCOORD0;\n" - "};\n" - "struct VS_OUT {\n" - " float2 Uv : TEXCOORD0;\n" - " float4 ProjPos : SV_Position;\n" - "};\n" - "VS_OUT main(VS_IN In) {\n" - " VS_OUT Out;\n" - " Out.ProjPos = In.ObjPos;\n" - " Out.Uv = In.Uv;\n" - " return Out;\n" - "}\n"; - -static const char *pscode = - "SamplerState samp : register(s0);\n" - "Texture2D tex : register(t0);\n" - "struct PS_IN {\n" - " float2 Uv : TEXCOORD0;\n" - "};\n" - "float4 main( PS_IN In ) : SV_Target {\n" - " float4 c = tex.Sample(samp, In.Uv);\n" - " return c;\n" - "}\n"; - -const D3D11_INPUT_ELEMENT_DESC FramebufferManagerD3D11::g_QuadVertexElements[2] = { - { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, }, -}; - FramebufferManagerD3D11::FramebufferManagerD3D11(Draw::DrawContext *draw) : FramebufferManagerCommon(draw) { device_ = (ID3D11Device *)draw->GetNativeObject(Draw::NativeObject::DEVICE); context_ = (ID3D11DeviceContext *)draw->GetNativeObject(Draw::NativeObject::CONTEXT); featureLevel_ = (D3D_FEATURE_LEVEL)draw->GetNativeObject(Draw::NativeObject::FEATURE_LEVEL); - std::vector bytecode; - - std::string errorMsg; - quadVertexShader_ = CreateVertexShaderD3D11(device_, vscode, strlen(vscode), &bytecode, featureLevel_); - quadPixelShader_ = CreatePixelShaderD3D11(device_, pscode, strlen(pscode), featureLevel_); - ASSERT_SUCCESS(device_->CreateInputLayout(g_QuadVertexElements, ARRAY_SIZE(g_QuadVertexElements), bytecode.data(), bytecode.size(), &quadInputLayout_)); - - // STRIP geometry - static const float fsCoord[20] = { - -1.0f,-1.0f, 0.0f, 0.0f, 0.0f, - 1.0f,-1.0f, 0.0f, 1.0f, 0.0f, - -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, - 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, - }; D3D11_BUFFER_DESC vb{}; vb.ByteWidth = 20 * 4; vb.Usage = D3D11_USAGE_IMMUTABLE; - vb.CPUAccessFlags = 0; vb.BindFlags = D3D11_BIND_VERTEX_BUFFER; - D3D11_SUBRESOURCE_DATA data{ fsCoord }; - ASSERT_SUCCESS(device_->CreateBuffer(&vb, &data, &fsQuadBuffer_)); vb.Usage = D3D11_USAGE_DYNAMIC; vb.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; ASSERT_SUCCESS(device_->CreateBuffer(&vb, nullptr, &quadBuffer_)); @@ -127,13 +78,7 @@ FramebufferManagerD3D11::FramebufferManagerD3D11(Draw::DrawContext *draw) FramebufferManagerD3D11::~FramebufferManagerD3D11() { // Drawing cleanup - if (quadVertexShader_) - quadVertexShader_->Release(); - if (quadPixelShader_) - quadPixelShader_->Release(); - quadInputLayout_->Release(); quadBuffer_->Release(); - fsQuadBuffer_->Release(); // Stencil cleanup for (int i = 0; i < 256; i++) { @@ -167,12 +112,6 @@ void FramebufferManagerD3D11::SetDrawEngine(DrawEngineD3D11 *td) { drawEngine_ = td; } -void FramebufferManagerD3D11::Bind2DShader() { - context_->IASetInputLayout(quadInputLayout_); - context_->PSSetShader(quadPixelShader_, 0, 0); - context_->VSSetShader(quadVertexShader_, 0, 0); -} - static void CopyPixelDepthOnly(u32 *dstp, const u32 *srcp, size_t c) { size_t x = 0; diff --git a/GPU/D3D11/FramebufferManagerD3D11.h b/GPU/D3D11/FramebufferManagerD3D11.h index cc4a67bbd1..dc46158cc4 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.h +++ b/GPU/D3D11/FramebufferManagerD3D11.h @@ -48,22 +48,14 @@ public: } private: - void Bind2DShader() override; void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h); ID3D11Device *device_; ID3D11DeviceContext *context_; D3D_FEATURE_LEVEL featureLevel_; - ID3D11VertexShader *quadVertexShader_; - ID3D11PixelShader *quadPixelShader_; - ID3D11InputLayout *quadInputLayout_; // Dynamic ID3D11Buffer *quadBuffer_; - ID3D11Buffer *fsQuadBuffer_; - const UINT quadStride_ = 20; - const UINT quadOffset_ = 0; - static const D3D11_INPUT_ELEMENT_DESC g_QuadVertexElements[2]; ID3D11PixelShader *stencilUploadPS_ = nullptr; ID3D11VertexShader *stencilUploadVS_ = nullptr; diff --git a/GPU/Directx9/FramebufferManagerDX9.cpp b/GPU/Directx9/FramebufferManagerDX9.cpp index 1386427db3..aec99b20c3 100644 --- a/GPU/Directx9/FramebufferManagerDX9.cpp +++ b/GPU/Directx9/FramebufferManagerDX9.cpp @@ -47,59 +47,11 @@ namespace DX9 { -static const char *vscode = R"( -struct VS_IN { - float4 ObjPos : POSITION; - float2 Uv : TEXCOORD0; -}; -struct VS_OUT { - float4 ProjPos : POSITION; - float2 Uv : TEXCOORD0; -}; -VS_OUT main( VS_IN In ) { - VS_OUT Out; - Out.ProjPos = In.ObjPos; - Out.Uv = In.Uv; - return Out; -} -)"; - -static const char *pscode = R"( -sampler s: register(s0); -struct PS_IN { - float2 Uv : TEXCOORD0; -}; -float4 main( PS_IN In ) : COLOR { - float4 c = tex2D(s, In.Uv); - return c; -} -)"; - -static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { - { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, - { 0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, - D3DDECL_END() -}; - FramebufferManagerDX9::FramebufferManagerDX9(Draw::DrawContext *draw) : FramebufferManagerCommon(draw) { device_ = (LPDIRECT3DDEVICE9)draw->GetNativeObject(Draw::NativeObject::DEVICE); deviceEx_ = (LPDIRECT3DDEVICE9)draw->GetNativeObject(Draw::NativeObject::DEVICE_EX); - std::string errorMsg; - if (!CompileVertexShaderD3D9(device_, vscode, &pFramebufferVertexShader, &errorMsg)) { - OutputDebugStringA(errorMsg.c_str()); - } - - if (!CompilePixelShaderD3D9(device_, pscode, &pFramebufferPixelShader, &errorMsg)) { - OutputDebugStringA(errorMsg.c_str()); - if (pFramebufferVertexShader) { - pFramebufferVertexShader->Release(); - } - } - - device_->CreateVertexDeclaration(g_FramebufferVertexElements, &pFramebufferVertexDecl); - int usage = 0; D3DPOOL pool = D3DPOOL_MANAGED; @@ -118,24 +70,9 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { } FramebufferManagerDX9::~FramebufferManagerDX9() { - if (pFramebufferVertexShader) { - pFramebufferVertexShader->Release(); - pFramebufferVertexShader = nullptr; - } - if (pFramebufferPixelShader) { - pFramebufferPixelShader->Release(); - pFramebufferPixelShader = nullptr; - } - pFramebufferVertexDecl->Release(); for (auto &it : offscreenSurfaces_) { it.second.surface->Release(); } - if (stencilUploadPS_) { - stencilUploadPS_->Release(); - } - if (stencilUploadVS_) { - stencilUploadVS_->Release(); - } if (nullTex_) nullTex_->Release(); } @@ -152,12 +89,6 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { drawEngine_ = td; } - void FramebufferManagerDX9::Bind2DShader() { - device_->SetVertexDeclaration(pFramebufferVertexDecl); - device_->SetPixelShader(pFramebufferPixelShader); - device_->SetVertexShader(pFramebufferVertexShader); - } - LPDIRECT3DSURFACE9 FramebufferManagerDX9::GetOffscreenSurface(LPDIRECT3DSURFACE9 similarSurface, VirtualFramebuffer *vfb) { D3DSURFACE_DESC desc = {}; HRESULT hr = similarSurface->GetDesc(&desc); diff --git a/GPU/Directx9/FramebufferManagerDX9.h b/GPU/Directx9/FramebufferManagerDX9.h index 9340aaf971..c39b032fcd 100644 --- a/GPU/Directx9/FramebufferManagerDX9.h +++ b/GPU/Directx9/FramebufferManagerDX9.h @@ -56,7 +56,6 @@ public: LPDIRECT3DSURFACE9 GetOffscreenSurface(D3DFORMAT fmt, u32 w, u32 h); protected: - void Bind2DShader() override; void DecimateFBOs() override; private: @@ -67,14 +66,6 @@ private: LPDIRECT3DDEVICE9 device_; LPDIRECT3DDEVICE9 deviceEx_; - LPDIRECT3DVERTEXSHADER9 pFramebufferVertexShader = nullptr; - LPDIRECT3DPIXELSHADER9 pFramebufferPixelShader = nullptr; - LPDIRECT3DVERTEXDECLARATION9 pFramebufferVertexDecl = nullptr; - - LPDIRECT3DPIXELSHADER9 stencilUploadPS_ = nullptr; - LPDIRECT3DVERTEXSHADER9 stencilUploadVS_ = nullptr; - bool stencilUploadFailed_ = false; - LPDIRECT3DTEXTURE9 nullTex_ = nullptr; struct OffscreenSurface { @@ -85,4 +76,4 @@ private: std::unordered_map offscreenSurfaces_; }; -}; +} diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index 8d1bcc629d..d4ad9dadd4 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -70,33 +70,6 @@ void main() { } )"; -void FramebufferManagerGLES::CompileDraw2DProgram() { - if (!draw2dprogram_) { - std::string errorString; - static std::string vs_code, fs_code; - vs_code = ApplyGLSLPrelude(basic_vs, GL_VERTEX_SHADER); - fs_code = ApplyGLSLPrelude(tex_fs, GL_FRAGMENT_SHADER); - std::vector shaders; - shaders.push_back(render_->CreateShader(GL_VERTEX_SHADER, vs_code, "draw2d")); - shaders.push_back(render_->CreateShader(GL_FRAGMENT_SHADER, fs_code, "draw2d")); - - std::vector queries; - queries.push_back({ &u_draw2d_tex, "u_tex" }); - std::vector initializers; - initializers.push_back({ &u_draw2d_tex, 0 }); - std::vector semantics; - semantics.push_back({ 0, "a_position" }); - semantics.push_back({ 1, "a_texcoord0" }); - draw2dprogram_ = render_->CreateProgram(shaders, semantics, queries, initializers, false, false); - for (auto shader : shaders) - render_->DeleteShader(shader); - } -} - -void FramebufferManagerGLES::Bind2DShader() { - render_->BindProgram(draw2dprogram_); -} - FramebufferManagerGLES::FramebufferManagerGLES(Draw::DrawContext *draw, GLRenderManager *render) : FramebufferManagerCommon(draw), render_(render) @@ -109,7 +82,6 @@ FramebufferManagerGLES::FramebufferManagerGLES(Draw::DrawContext *draw, GLRender void FramebufferManagerGLES::Init() { FramebufferManagerCommon::Init(); - CompileDraw2DProgram(); } void FramebufferManagerGLES::SetTextureCache(TextureCacheGLES *tc) { @@ -126,25 +98,9 @@ void FramebufferManagerGLES::SetDrawEngine(DrawEngineGLES *td) { } void FramebufferManagerGLES::CreateDeviceObjects() { - CompileDraw2DProgram(); - - std::vector entries; - entries.push_back({ 0, 3, GL_FLOAT, GL_FALSE, sizeof(Simple2DVertex), offsetof(Simple2DVertex, pos) }); - entries.push_back({ 1, 2, GL_FLOAT, GL_FALSE, sizeof(Simple2DVertex), offsetof(Simple2DVertex, uv) }); - simple2DInputLayout_ = render_->CreateInputLayout(entries); } void FramebufferManagerGLES::DestroyDeviceObjects() { - if (simple2DInputLayout_) { - render_->DeleteInputLayout(simple2DInputLayout_); - simple2DInputLayout_ = nullptr; - } - - if (draw2dprogram_) { - render_->DeleteProgram(draw2dprogram_); - draw2dprogram_ = nullptr; - } - if (stencilUploadPipeline_) { stencilUploadPipeline_->Release(); stencilUploadPipeline_ = nullptr; diff --git a/GPU/GLES/FramebufferManagerGLES.h b/GPU/GLES/FramebufferManagerGLES.h index 349b5a23e6..adbd1b8ddf 100644 --- a/GPU/GLES/FramebufferManagerGLES.h +++ b/GPU/GLES/FramebufferManagerGLES.h @@ -56,9 +56,6 @@ private: void CreateDeviceObjects(); void DestroyDeviceObjects(); - void Bind2DShader() override; - void CompileDraw2DProgram(); - void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h); GLRenderManager *render_; @@ -66,22 +63,12 @@ private: u8 *convBuf_ = nullptr; u32 convBufSize_ = 0; - GLRProgram *draw2dprogram_ = nullptr; - GLRProgram *depthDownloadProgram_ = nullptr; int u_depthDownloadTex = -1; int u_depthDownloadFactor = -1; int u_depthDownloadShift = -1; int u_depthDownloadTo8 = -1; - // Cached uniform locs - int u_draw2d_tex = -1; - DrawEngineGLES *drawEngineGL_ = nullptr; - struct Simple2DVertex { - float pos[3]; - float uv[2]; - }; - GLRInputLayout *simple2DInputLayout_ = nullptr; }; diff --git a/GPU/Vulkan/FramebufferManagerVulkan.cpp b/GPU/Vulkan/FramebufferManagerVulkan.cpp index 0cb6334016..25107040c2 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.cpp +++ b/GPU/Vulkan/FramebufferManagerVulkan.cpp @@ -100,52 +100,10 @@ void FramebufferManagerVulkan::SetDrawEngine(DrawEngineVulkan *td) { } void FramebufferManagerVulkan::InitDeviceObjects() { - VulkanContext *vulkan = (VulkanContext *)draw_->GetNativeObject(Draw::NativeObject::CONTEXT); - std::string fs_errors, vs_errors; - fsBasicTex_ = CompileShaderModule(vulkan, VK_SHADER_STAGE_FRAGMENT_BIT, tex_fs, &fs_errors); - vsBasicTex_ = CompileShaderModule(vulkan, VK_SHADER_STAGE_VERTEX_BIT, tex_vs, &vs_errors); - _assert_(fsBasicTex_ != VK_NULL_HANDLE); - _assert_(vsBasicTex_ != VK_NULL_HANDLE); - - VkSamplerCreateInfo samp = { VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO }; - samp.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; - samp.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; - samp.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; - samp.magFilter = VK_FILTER_NEAREST; - samp.minFilter = VK_FILTER_NEAREST; - VkResult res = vkCreateSampler(vulkan->GetDevice(), &samp, nullptr, &nearestSampler_); - _assert_(res == VK_SUCCESS); - samp.magFilter = VK_FILTER_LINEAR; - samp.minFilter = VK_FILTER_LINEAR; - res = vkCreateSampler(vulkan->GetDevice(), &samp, nullptr, &linearSampler_); - _assert_(res == VK_SUCCESS); } void FramebufferManagerVulkan::DestroyDeviceObjects() { - if (!draw_) - return; - VulkanContext *vulkan = (VulkanContext *)draw_->GetNativeObject(Draw::NativeObject::CONTEXT); - if (fsBasicTex_ != VK_NULL_HANDLE) { - vulkan2D_->PurgeFragmentShader(fsBasicTex_); - vulkan->Delete().QueueDeleteShaderModule(fsBasicTex_); - } - if (vsBasicTex_ != VK_NULL_HANDLE) { - vulkan2D_->PurgeVertexShader(vsBasicTex_); - vulkan->Delete().QueueDeleteShaderModule(vsBasicTex_); - } - if (stencilFs_ != VK_NULL_HANDLE) { - vulkan2D_->PurgeFragmentShader(stencilFs_); - vulkan->Delete().QueueDeleteShaderModule(stencilFs_); - } - if (stencilVs_ != VK_NULL_HANDLE) { - vulkan2D_->PurgeVertexShader(stencilVs_); - vulkan->Delete().QueueDeleteShaderModule(stencilVs_); - } - if (linearSampler_ != VK_NULL_HANDLE) - vulkan->Delete().QueueDeleteSampler(linearSampler_); - if (nearestSampler_ != VK_NULL_HANDLE) - vulkan->Delete().QueueDeleteSampler(nearestSampler_); } void FramebufferManagerVulkan::NotifyClear(bool clearColor, bool clearAlpha, bool clearDepth, uint32_t color, float depth) { @@ -170,11 +128,6 @@ void FramebufferManagerVulkan::NotifyClear(bool clearColor, bool clearAlpha, boo } } -void FramebufferManagerVulkan::Bind2DShader() { - VkRenderPass rp = (VkRenderPass)draw_->GetNativeObject(Draw::NativeObject::COMPATIBLE_RENDERPASS); - cur2DPipeline_ = vulkan2D_->GetPipeline(rp, vsBasicTex_, fsBasicTex_); -} - void FramebufferManagerVulkan::BeginFrameVulkan() { BeginFrame(); } diff --git a/GPU/Vulkan/FramebufferManagerVulkan.h b/GPU/Vulkan/FramebufferManagerVulkan.h index ad2f1df879..af3d9f2ef7 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.h +++ b/GPU/Vulkan/FramebufferManagerVulkan.h @@ -53,9 +53,6 @@ public: // do that. void NotifyClear(bool clearColor, bool clearAlpha, bool clearDepth, uint32_t color, float depth); -protected: - void Bind2DShader() override; - private: void InitDeviceObjects(); void DestroyDeviceObjects(); @@ -70,18 +67,6 @@ private: VkPipelineCache pipelineCache2D_; - // Basic shaders - VkShaderModule fsBasicTex_ = VK_NULL_HANDLE; - VkShaderModule vsBasicTex_ = VK_NULL_HANDLE; - - VkShaderModule stencilVs_ = VK_NULL_HANDLE; - VkShaderModule stencilFs_ = VK_NULL_HANDLE; - - VkPipeline cur2DPipeline_ = VK_NULL_HANDLE; - - VkSampler linearSampler_; - VkSampler nearestSampler_; - // Simple 2D drawing engine. Vulkan2D *vulkan2D_; };