From 49f1e702c93f06f0f83644bbf9226b5a46685826 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Tue, 5 Jan 2016 23:37:18 +0100 Subject: [PATCH] Okay, reached the shader generators --- GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp | 32 ++++++++++---------- GPU/Vulkan/GPU_Vulkan.cpp | 5 +++ GPU/Vulkan/GPU_Vulkan.h | 2 +- GPU/Vulkan/ShaderManagerVulkan.h | 30 +++++++----------- 4 files changed, 33 insertions(+), 36 deletions(-) diff --git a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp index 7be678c0b4..cd670ca0ad 100644 --- a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp @@ -168,18 +168,18 @@ bool GenerateVulkanGLSLFragmentShader(const ShaderID &id, char *buffer) { std::string modulo = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? "mymod" : "mod"; if (id.Bit(FS_BIT_CLAMP_S)) { - ucoord = "clamp(" + ucoord + ", u_texclamp.z, u_texclamp.x - u_texclamp.z)"; + ucoord = "clamp(" + ucoord + ", base.texclamp.z, base.texclamp.x - base.texclamp.z)"; } else { - ucoord = modulo + "(" + ucoord + ", u_texclamp.x)"; + ucoord = modulo + "(" + ucoord + ", base.texclamp.x)"; } if (id.Bit(FS_BIT_CLAMP_T)) { - vcoord = "clamp(" + vcoord + ", u_texclamp.w, u_texclamp.y - u_texclamp.w)"; + vcoord = "clamp(" + vcoord + ", base.texclamp.w, base.texclamp.y - base.texclamp.w)"; } else { - vcoord = modulo + "(" + vcoord + ", u_texclamp.y)"; + vcoord = modulo + "(" + vcoord + ", base.texclamp.y)"; } if (textureAtOffset) { - ucoord = "(" + ucoord + " + u_texclampoff.x)"; - vcoord = "(" + vcoord + " + u_texclampoff.y)"; + ucoord = "(" + ucoord + " + base.texclampoff.x)"; + vcoord = "(" + vcoord + " + base.texclampoff.y)"; } WRITE(p, " vec2 fixedcoord = vec2(%s, %s);\n", ucoord.c_str(), vcoord.c_str()); @@ -206,7 +206,7 @@ bool GenerateVulkanGLSLFragmentShader(const ShaderID &id, char *buffer) { break; case GE_TEXFUNC_BLEND: - WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a * t.a)%s;\n", secondary); + WRITE(p, " vec4 v = vec4(mix(p.rgb, base.texenv.rgb, t.rgb), p.a * t.a)%s;\n", secondary); break; case GE_TEXFUNC_REPLACE: @@ -233,7 +233,7 @@ bool GenerateVulkanGLSLFragmentShader(const ShaderID &id, char *buffer) { break; case GE_TEXFUNC_BLEND: - WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a)%s;\n", secondary); + WRITE(p, " vec4 v = vec4(mix(p.rgb, base.texenv.rgb, t.rgb), p.a)%s;\n", secondary); break; case GE_TEXFUNC_REPLACE: @@ -288,7 +288,7 @@ bool GenerateVulkanGLSLFragmentShader(const ShaderID &id, char *buffer) { } else { const char *alphaTestFuncs[] = { "#", "#", " != ", " == ", " >= ", " > ", " <= ", " < " }; if (alphaTestFuncs[alphaTestFunc][0] != '#') { - WRITE(p, " if ((roundAndScaleTo255i(v.a) & u_alphacolormask.a) %s int(u_alphacolorref.a)) discard;\n", alphaTestFuncs[alphaTestFunc]); + WRITE(p, " if ((roundAndScaleTo255i(v.a) & base.alphacolormask.a) %s int(base.alphacolorref.a)) discard;\n", alphaTestFuncs[alphaTestFunc]); } else { // This means NEVER. See above. WRITE(p, " discard;\n"); @@ -327,8 +327,8 @@ bool GenerateVulkanGLSLFragmentShader(const ShaderID &id, char *buffer) { if (colorTestFuncs[colorTestFunc][0] != '#') { // Apparently GLES3 does not support vector bitwise ops. WRITE(p, " ivec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); - const char *maskedFragColor = "ivec3(v_scaled.r & u_alphacolormask.r, v_scaled.g & u_alphacolormask.g, v_scaled.b & u_alphacolormask.b)"; - const char *maskedColorRef = "ivec3(int(u_alphacolorref.r) & u_alphacolormask.r, int(u_alphacolorref.g) & u_alphacolormask.g, int(u_alphacolorref.b) & u_alphacolormask.b)"; + const char *maskedFragColor = "ivec3(v_scaled.r & base.alphacolormask.r, v_scaled.g & base.alphacolormask.g, v_scaled.b & base.alphacolormask.b)"; + const char *maskedColorRef = "ivec3(int(base.alphacolorref.r) & base.alphacolormask.r, int(base.alphacolorref.g) & base.alphacolormask.g, int(base.alphacolorref.b) & base.alphacolormask.b)"; WRITE(p, " if (%s %s %s) discard;\n", maskedFragColor, colorTestFuncs[colorTestFunc], maskedColorRef); } else { WRITE(p, " discard;\n"); @@ -345,7 +345,7 @@ bool GenerateVulkanGLSLFragmentShader(const ShaderID &id, char *buffer) { if (enableFog) { WRITE(p, " float fogCoef = clamp(v_fogdepth, 0.0, 1.0);\n"); - WRITE(p, " v = mix(vec4(u_fogcolor, v.a), v, fogCoef);\n"); + WRITE(p, " v = mix(vec4(base.fogcolor, v.a), v, fogCoef);\n"); // WRITE(p, " v.x = v_depth;\n"); } @@ -362,7 +362,7 @@ bool GenerateVulkanGLSLFragmentShader(const ShaderID &id, char *buffer) { case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "vec3(1.0 - v.a * 2.0)"; break; case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "ERROR"; break; case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "ERROR"; break; - case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; + case GE_SRCBLEND_FIXA: srcFactor = "base.blendFixA"; break; } WRITE(p, " v.rgb = v.rgb * %s;\n", srcFactor); @@ -385,7 +385,7 @@ bool GenerateVulkanGLSLFragmentShader(const ShaderID &id, char *buffer) { case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "vec3(1.0 - v.a * 2.0)"; break; case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "vec3(destColor.a * 2.0)"; break; case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "vec3(1.0 - destColor.a * 2.0)"; break; - case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; + case GE_SRCBLEND_FIXA: srcFactor = "base.blendFixA"; break; } switch (replaceBlendFuncB) { case GE_DSTBLEND_SRCCOLOR: dstFactor = "v.rgb"; break; @@ -398,7 +398,7 @@ bool GenerateVulkanGLSLFragmentShader(const ShaderID &id, char *buffer) { case GE_DSTBLEND_DOUBLEINVSRCALPHA: dstFactor = "vec3(1.0 - v.a * 2.0)"; break; case GE_DSTBLEND_DOUBLEDSTALPHA: dstFactor = "vec3(destColor.a * 2.0)"; break; case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "vec3(1.0 - destColor.a * 2.0)"; break; - case GE_DSTBLEND_FIXB: dstFactor = "u_blendFixB"; break; + case GE_DSTBLEND_FIXB: dstFactor = "base.blendFixB"; break; } switch (replaceBlendEq) { @@ -433,7 +433,7 @@ bool GenerateVulkanGLSLFragmentShader(const ShaderID &id, char *buffer) { if (stencilToAlpha != REPLACE_ALPHA_NO) { switch (replaceAlphaWithStencilType) { case STENCIL_VALUE_UNIFORM: - replacedAlpha = "u_stencilReplaceValue"; + replacedAlpha = "base.stencilReplaceValue"; break; case STENCIL_VALUE_ZERO: diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index 77ce919ac5..25bee1aba9 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -578,6 +578,11 @@ void GPU_Vulkan::BeginFrameInternal() { shaderManager_->DirtyUniform(DIRTY_ALL); framebufferManager_.BeginFrame(); + + if (g_Config.iRenderingMode == FB_NON_BUFFERED_MODE) { + // Draw everything directly to the backbuffer. + drawEngine_.SetCmdBuffer(vulkan_->GetSurfaceCommandBuffer()); + } } void GPU_Vulkan::SetDisplayFramebuffer(u32 framebuf, u32 stride, GEBufferFormat format) { diff --git a/GPU/Vulkan/GPU_Vulkan.h b/GPU/Vulkan/GPU_Vulkan.h index f5813a1435..e292a567b7 100644 --- a/GPU/Vulkan/GPU_Vulkan.h +++ b/GPU/Vulkan/GPU_Vulkan.h @@ -146,6 +146,7 @@ public: bool GetCurrentSimpleVertices(int count, std::vector &vertices, std::vector &indices); bool DescribeCodePtr(const u8 *ptr, std::string &name); + protected: void FastRunLoop(DisplayList &list) override; void ProcessEvent(GPUEvent ev) override; @@ -169,7 +170,6 @@ private: void ReinitializeInternal(); inline void UpdateVsyncInterval(bool force); void UpdateCmdInfo(); - static CommandInfo cmdInfo_[256]; GraphicsContext *gfxCtx_; diff --git a/GPU/Vulkan/ShaderManagerVulkan.h b/GPU/Vulkan/ShaderManagerVulkan.h index 75c8daae4b..4bdc3951e1 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.h +++ b/GPU/Vulkan/ShaderManagerVulkan.h @@ -89,27 +89,19 @@ R"(matrix4x4 proj; matrix4x4 view; matrix4x4 world; matrix4x4 tex; - vec4 uvScaleOffset; + vec4 uvScaleOffset; vec4 depthRange; vec2 fogCoef; - vec4 matAmbient; - // Blend function replacement - vec3 u_blendFixA; - vec3 u_blendFixB; - - // Texture clamp emulation - vec4 u_texclamp; - vec2 u_texclampoff; - - // Alpha/Color test emulation - vec4 u_alphacolorref; - ivec4 u_alphacolormask; - - // Stencil replacement - float u_stencilReplaceValue; - vec3 u_texenv; - - vec3 u_fogcolor; + vec4 matAmbient; + vec3 blendFixA; // Blend func replace + vec3 blendFixB; + vec4 texclamp; // Texture clamp emu + vec2 texclampoff; + vec4 alphacolorref; // Alpha/Color test + ivec4 alphacolormask; + float stencilReplaceValue; // Stencil replacement + vec3 texenv; + vec3 fogcolor; )"; struct UB_VS_Lights {