From 103d180ae7de18d1a8540451c29878aa4df0f39e Mon Sep 17 00:00:00 2001 From: xebra Date: Sat, 14 Jul 2018 00:14:19 +0900 Subject: [PATCH] [spline/bezier]Get rid of wasted if-checks at Graphics Processors. --- GPU/Directx9/VertexShaderGeneratorDX9.cpp | 5 ++--- GPU/GLES/VertexShaderGeneratorGLES.cpp | 5 ++--- GPU/Vulkan/VertexShaderGeneratorVulkan.cpp | 5 ++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/GPU/Directx9/VertexShaderGeneratorDX9.cpp b/GPU/Directx9/VertexShaderGeneratorDX9.cpp index 5ff0f6978f09..5f5a98f1176c 100644 --- a/GPU/Directx9/VertexShaderGeneratorDX9.cpp +++ b/GPU/Directx9/VertexShaderGeneratorDX9.cpp @@ -287,11 +287,10 @@ void GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage // Define 3 types float2, float3, float4 WRITE(p, "float%d tess_sample(in float%d points[16], float4 weights_u, float4 weights_v) {\n", i, i); WRITE(p, " float%d pos = float%d(%s);\n", i, i, init[i - 2]); + WRITE(p, " int idx = 0;\n"); WRITE(p, " for (int v = 0; v < 4; ++v) {\n"); WRITE(p, " for (int u = 0; u < 4; ++u) {\n"); - WRITE(p, " float f = weights_u[u] * weights_v[v];\n"); - WRITE(p, " if (f != 0.0)\n"); - WRITE(p, " pos = pos + f * points[v * 4 + u];\n"); + WRITE(p, " pos += weights_u[u] * weights_v[v] * points[idx++];\n"); WRITE(p, " }\n"); WRITE(p, " }\n"); WRITE(p, " return pos;\n"); diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 84c782325da8..714c8f322b98 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -390,11 +390,10 @@ void GenerateVertexShader(const VShaderID &id, char *buffer, uint32_t *attrMask, // Define 3 types vec2, vec3, vec4 WRITE(p, "vec%d tess_sample(in vec%d points[16], vec4 weights_u, vec4 weights_v) {\n", i, i); WRITE(p, " vec%d pos = vec%d(0.0);\n", i, i); + WRITE(p, " int idx = 0;\n"); WRITE(p, " for (int v = 0; v < 4; ++v) {\n"); WRITE(p, " for (int u = 0; u < 4; ++u) {\n"); - WRITE(p, " float f = weights_u[u] * weights_v[v];\n"); - WRITE(p, " if (f != 0.0)\n"); - WRITE(p, " pos += f * points[v * 4 + u];\n"); + WRITE(p, " pos += weights_u[u] * weights_v[v] * points[idx++];\n"); WRITE(p, " }\n"); WRITE(p, " }\n"); WRITE(p, " return pos;\n"); diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp index a45e10c70f0b..f1230f282977 100644 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp @@ -239,11 +239,10 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { // Define 3 types vec2, vec3, vec4 WRITE(p, "vec%d tess_sample(in vec%d points[16], vec4 weights_u, vec4 weights_v) {\n", i, i); WRITE(p, " vec%d pos = vec%d(0.0);\n", i, i); + WRITE(p, " int idx = 0;\n"); WRITE(p, " for (int v = 0; v < 4; ++v) {\n"); WRITE(p, " for (int u = 0; u < 4; ++u) {\n"); - WRITE(p, " float f = weights_u[u] * weights_v[v];\n"); - WRITE(p, " if (f != 0.0)\n"); - WRITE(p, " pos += f * points[v * 4 + u];\n"); + WRITE(p, " pos += weights_u[u] * weights_v[v] * points[idx++];\n"); WRITE(p, " }\n"); WRITE(p, " }\n"); WRITE(p, " return pos;\n");