mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-15 11:18:36 +12:00
rsx/vk/gl: Cleanup and refector glsl::getFunctionImpl
- Both backends now generate very similar code
This commit is contained in:
parent
86fa379c78
commit
4e9160104a
9 changed files with 75 additions and 149 deletions
|
@ -334,11 +334,6 @@ namespace glsl
|
||||||
OS << " return decodeLinearDepth(texture(tex, coord.xy).r);\n";
|
OS << " return decodeLinearDepth(texture(tex, coord.xy).r);\n";
|
||||||
OS << "}\n\n";
|
OS << "}\n\n";
|
||||||
|
|
||||||
OS << "vec4 texture2DReconstruct(sampler2DRect tex, vec2 coord)\n";
|
|
||||||
OS << "{\n";
|
|
||||||
OS << " return decodeLinearDepth(texture(tex, coord.xy).r);\n";
|
|
||||||
OS << "}\n\n";
|
|
||||||
|
|
||||||
OS << "vec4 get_wpos()\n";
|
OS << "vec4 get_wpos()\n";
|
||||||
OS << "{\n";
|
OS << "{\n";
|
||||||
OS << " float abs_scale = abs(wpos_scale);\n";
|
OS << " float abs_scale = abs(wpos_scale);\n";
|
||||||
|
@ -350,4 +345,75 @@ namespace glsl
|
||||||
{
|
{
|
||||||
program_common::insert_fog_declaration(OS, "vec4", "fog_c");
|
program_common::insert_fog_declaration(OS, "vec4", "fog_c");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string getFunctionImpl(FUNCTION f)
|
||||||
|
{
|
||||||
|
switch (f)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
abort();
|
||||||
|
case FUNCTION::FUNCTION_DP2:
|
||||||
|
return "vec4(dot($0.xy, $1.xy))";
|
||||||
|
case FUNCTION::FUNCTION_DP2A:
|
||||||
|
return "vec4(dot($0.xy, $1.xy) + $2.x)";
|
||||||
|
case FUNCTION::FUNCTION_DP3:
|
||||||
|
return "vec4(dot($0.xyz, $1.xyz))";
|
||||||
|
case FUNCTION::FUNCTION_DP4:
|
||||||
|
return "vec4(dot($0, $1))";
|
||||||
|
case FUNCTION::FUNCTION_DPH:
|
||||||
|
return "vec4(dot(vec4($0.xyz, 1.0), $1))";
|
||||||
|
case FUNCTION::FUNCTION_SFL:
|
||||||
|
return "vec4(0., 0., 0., 0.)";
|
||||||
|
case FUNCTION::FUNCTION_STR:
|
||||||
|
return "vec4(1., 1., 1., 1.)";
|
||||||
|
case FUNCTION::FUNCTION_FRACT:
|
||||||
|
return "fract($0)";
|
||||||
|
case FUNCTION::FUNCTION_REFL:
|
||||||
|
return "vec4($0 - 2.0 * (dot($0, $1)) * $1)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLE1D:
|
||||||
|
return "texture($t, $0.x)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLE1D_PROJ:
|
||||||
|
return "textureProj($t, $0.x, $1.x)"; // Note: $1.x is bias
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLE1D_LOD:
|
||||||
|
return "textureLod($t, $0.x, $1.x)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLE1D_GRAD:
|
||||||
|
return "textureGrad($t, $0.x, $1.x, $2.x)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D:
|
||||||
|
return "texture($t, $0.xy * texture_parameters[$_i].xy)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_PROJ:
|
||||||
|
return "textureProj($t, $0 , $1.x)"; // Note: $1.x is bias
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_LOD:
|
||||||
|
return "textureLod($t, $0.xy * texture_parameters[$_i].xy, $1.x)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_GRAD:
|
||||||
|
return "textureGrad($t, $0.xy * texture_parameters[$_i].xy , $1.xy, $2.xy)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SHADOW2D:
|
||||||
|
return "texture($t, $0.xyz)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SHADOW2D_PROJ:
|
||||||
|
return "textureProj($t, $0, $1.x)"; // Note: $1.x is bias
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLECUBE:
|
||||||
|
return "texture($t, $0.xyz)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLECUBE_PROJ:
|
||||||
|
return "texture($t, ($0.xyz / $0.w))";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLECUBE_LOD:
|
||||||
|
return "textureLod($t, $0.xyz, $1.x)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLECUBE_GRAD:
|
||||||
|
return "textureGrad($t, $0.xyz, $1.xyz, $2.xyz)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLE3D:
|
||||||
|
return "texture($t, $0.xyz)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLE3D_PROJ:
|
||||||
|
return "textureProj($t, $0.xyzw, $1.x)"; // Note: $1.x is bias
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLE3D_LOD:
|
||||||
|
return "textureLod($t, $0.xyz, $1.x)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLE3D_GRAD:
|
||||||
|
return "textureGrad($t, $0.xyz, $1.xyz, $2.xyz)";
|
||||||
|
case FUNCTION::FUNCTION_DFDX:
|
||||||
|
return "dFdx($0)";
|
||||||
|
case FUNCTION::FUNCTION_DFDY:
|
||||||
|
return "dFdy($0)";
|
||||||
|
case FUNCTION::FUNCTION_VERTEX_TEXTURE_FETCH2D:
|
||||||
|
return "textureLod($t, $0.xy, 0)";
|
||||||
|
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_DEPTH_RGBA:
|
||||||
|
return "texture2DReconstruct($t, $0.xy * texture_parameters[$_i].xy)";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -4,77 +4,6 @@
|
||||||
|
|
||||||
namespace gl
|
namespace gl
|
||||||
{
|
{
|
||||||
std::string getFunctionImpl(FUNCTION f)
|
|
||||||
{
|
|
||||||
switch (f)
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
abort();
|
|
||||||
case FUNCTION::FUNCTION_DP2:
|
|
||||||
return "vec4(dot($0.xy, $1.xy))";
|
|
||||||
case FUNCTION::FUNCTION_DP2A:
|
|
||||||
return "vec4(dot($0.xy, $1.xy) + $2.x)";
|
|
||||||
case FUNCTION::FUNCTION_DP3:
|
|
||||||
return "vec4(dot($0.xyz, $1.xyz))";
|
|
||||||
case FUNCTION::FUNCTION_DP4:
|
|
||||||
return "vec4(dot($0, $1))";
|
|
||||||
case FUNCTION::FUNCTION_DPH:
|
|
||||||
return "vec4(dot(vec4($0.xyz, 1.0), $1))";
|
|
||||||
case FUNCTION::FUNCTION_SFL:
|
|
||||||
return "vec4(0., 0., 0., 0.)";
|
|
||||||
case FUNCTION::FUNCTION_STR:
|
|
||||||
return "vec4(1., 1., 1., 1.)";
|
|
||||||
case FUNCTION::FUNCTION_FRACT:
|
|
||||||
return "fract($0)";
|
|
||||||
case FUNCTION::FUNCTION_REFL:
|
|
||||||
return "vec4($0 - 2.0 * (dot($0, $1)) * $1)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE1D:
|
|
||||||
return "texture($t, $0.x)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE1D_PROJ:
|
|
||||||
return "textureProj($t, $0.x, $1.x)"; // Note: $1.x is bias
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE1D_LOD:
|
|
||||||
return "textureLod($t, $0.x, $1.x)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE1D_GRAD:
|
|
||||||
return "textureGrad($t, $0.x, $1.x, $2.x)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D:
|
|
||||||
return "texture($t, $0.xy * texture_parameters[$_i].xy)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_PROJ:
|
|
||||||
return "textureProj($t, $0 , $1.x)"; // Note: $1.x is bias
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_LOD:
|
|
||||||
return "textureLod($t, $0.xy * texture_parameters[$_i].xy, $1.x)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_GRAD:
|
|
||||||
return "textureGrad($t, $0.xy * texture_parameters[$_i].xy , $1.xy, $2.xy)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SHADOW2D:
|
|
||||||
return "texture($t, $0.xyz)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SHADOW2D_PROJ:
|
|
||||||
return "textureProj($t, $0, $1.x)"; // Note: $1.x is bias
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLECUBE:
|
|
||||||
return "texture($t, $0.xyz)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLECUBE_PROJ:
|
|
||||||
return "texture($t, ($0.xyz / $0.w))";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLECUBE_LOD:
|
|
||||||
return "textureLod($t, $0.xyz, $1.x)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLECUBE_GRAD:
|
|
||||||
return "textureGrad($t, $0.xyz, $1.xyz, $2.xyz)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE3D:
|
|
||||||
return "texture($t, $0.xyz)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE3D_PROJ:
|
|
||||||
return "textureProj($t, $0.xyzw, $1.x)"; // Note: $1.x is bias
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE3D_LOD:
|
|
||||||
return "textureLod($t, $0.xyz, $1.x)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE3D_GRAD:
|
|
||||||
return "textureGrad($t, $0.xyz, $1.xyz, $2.xyz)";
|
|
||||||
case FUNCTION::FUNCTION_DFDX:
|
|
||||||
return "dFdx($0)";
|
|
||||||
case FUNCTION::FUNCTION_DFDY:
|
|
||||||
return "dFdy($0)";
|
|
||||||
case FUNCTION::FUNCTION_VERTEX_TEXTURE_FETCH2D:
|
|
||||||
return "textureLod($t, $0.xy, 0)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_DEPTH_RGBA:
|
|
||||||
return "texture2DReconstruct($t, $0.xy * texture_parameters[$_i].xy)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_varying_register_location(const std::string &var_name)
|
int get_varying_register_location(const std::string &var_name)
|
||||||
{
|
{
|
||||||
static const std::pair<std::string, int> reg_table[] =
|
static const std::pair<std::string, int> reg_table[] =
|
||||||
|
|
|
@ -6,6 +6,5 @@
|
||||||
|
|
||||||
namespace gl
|
namespace gl
|
||||||
{
|
{
|
||||||
std::string getFunctionImpl(FUNCTION f);
|
|
||||||
int get_varying_register_location(const std::string &var_name);
|
int get_varying_register_location(const std::string &var_name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ std::string GLFragmentDecompilerThread::getFloatTypeName(size_t elementCount)
|
||||||
|
|
||||||
std::string GLFragmentDecompilerThread::getFunction(FUNCTION f)
|
std::string GLFragmentDecompilerThread::getFunction(FUNCTION f)
|
||||||
{
|
{
|
||||||
return gl::getFunctionImpl(f);
|
return glsl::getFunctionImpl(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string GLFragmentDecompilerThread::saturate(const std::string & code)
|
std::string GLFragmentDecompilerThread::saturate(const std::string & code)
|
||||||
|
|
|
@ -18,10 +18,9 @@ std::string GLVertexDecompilerThread::getIntTypeName(size_t elementCount)
|
||||||
return "ivec4";
|
return "ivec4";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string GLVertexDecompilerThread::getFunction(FUNCTION f)
|
std::string GLVertexDecompilerThread::getFunction(FUNCTION f)
|
||||||
{
|
{
|
||||||
return gl::getFunctionImpl(f);
|
return glsl::getFunctionImpl(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string GLVertexDecompilerThread::compareFunction(COMPARE f, const std::string &Op0, const std::string &Op1)
|
std::string GLVertexDecompilerThread::compareFunction(COMPARE f, const std::string &Op0, const std::string &Op1)
|
||||||
|
|
|
@ -8,69 +8,6 @@ namespace vk
|
||||||
{
|
{
|
||||||
static TBuiltInResource g_default_config;
|
static TBuiltInResource g_default_config;
|
||||||
|
|
||||||
std::string getFunctionImpl(FUNCTION f)
|
|
||||||
{
|
|
||||||
switch (f)
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
abort();
|
|
||||||
case FUNCTION::FUNCTION_DP2:
|
|
||||||
return "vec4(dot($0.xy, $1.xy))";
|
|
||||||
case FUNCTION::FUNCTION_DP2A:
|
|
||||||
return "vec4(dot($0.xy, $1.xy) + $2.x)";
|
|
||||||
case FUNCTION::FUNCTION_DP3:
|
|
||||||
return "vec4(dot($0.xyz, $1.xyz))";
|
|
||||||
case FUNCTION::FUNCTION_DP4:
|
|
||||||
return "vec4(dot($0, $1))";
|
|
||||||
case FUNCTION::FUNCTION_DPH:
|
|
||||||
return "vec4(dot(vec4($0.xyz, 1.0), $1))";
|
|
||||||
case FUNCTION::FUNCTION_SFL:
|
|
||||||
return "vec4(0., 0., 0., 0.)";
|
|
||||||
case FUNCTION::FUNCTION_STR:
|
|
||||||
return "vec4(1., 1., 1., 1.)";
|
|
||||||
case FUNCTION::FUNCTION_FRACT:
|
|
||||||
return "fract($0)";
|
|
||||||
case FUNCTION::FUNCTION_REFL:
|
|
||||||
return "vec4($0 - 2.0 * (dot($0, $1)) * $1)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE1D:
|
|
||||||
return "texture($t, $0.x)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE1D_PROJ:
|
|
||||||
return "textureProj($t, $0.x, $1.x)"; // Note: $1.x is bias
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE1D_LOD:
|
|
||||||
return "textureLod($t, $0.x, $1.x)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE1D_GRAD:
|
|
||||||
return "textureGrad($t, $0.x, $1.x, $2.x)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D:
|
|
||||||
return "texture($t, $0.xy * texture_parameters[$_i].xy)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_PROJ:
|
|
||||||
return "textureProj($t, $0, $1.x)"; // Note: $1.x is bias
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_LOD:
|
|
||||||
return "textureLod($t, $0.xy * texture_parameters[$_i].xy, $1.x)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_GRAD:
|
|
||||||
return "textureGrad($t, $0.xy * texture_parameters[$_i].xy, $1.xy, $2.xy)"; // Note: $1.x is bias
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SHADOW2D:
|
|
||||||
return "texture($t, $0.xyz)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SHADOW2D_PROJ:
|
|
||||||
return "textureProj($t, $0, $1.x)"; // Note: $1.x is bias
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLECUBE:
|
|
||||||
return "texture($t, $0.xyz)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLECUBE_PROJ:
|
|
||||||
return "texture($t, ($0.xyz / $0.w))";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLECUBE_LOD:
|
|
||||||
return "textureLod($t, $0.xyz, $1.x)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLECUBE_GRAD:
|
|
||||||
return "textureGrad($t, $0.xyz, $1.xyz, $2.xyz)";
|
|
||||||
case FUNCTION::FUNCTION_DFDX:
|
|
||||||
return "dFdx($0)";
|
|
||||||
case FUNCTION::FUNCTION_DFDY:
|
|
||||||
return "dFdy($0)";
|
|
||||||
case FUNCTION::FUNCTION_VERTEX_TEXTURE_FETCH2D:
|
|
||||||
return "textureLod($t, $0.xy, 0)";
|
|
||||||
case FUNCTION::FUNCTION_TEXTURE_SAMPLE2D_DEPTH_RGBA:
|
|
||||||
return "texture2DReconstruct($t, $0.xy * texture_parameters[$_i].xy)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void init_default_resources(TBuiltInResource &rsc)
|
void init_default_resources(TBuiltInResource &rsc)
|
||||||
{
|
{
|
||||||
rsc.maxLights = 32;
|
rsc.maxLights = 32;
|
||||||
|
|
|
@ -12,9 +12,6 @@ namespace vk
|
||||||
int reg_location;
|
int reg_location;
|
||||||
};
|
};
|
||||||
|
|
||||||
//Decompiler function lookup
|
|
||||||
std::string getFunctionImpl(FUNCTION f);
|
|
||||||
|
|
||||||
const varying_register_t& get_varying_register(const std::string& name);
|
const varying_register_t& get_varying_register(const std::string& name);
|
||||||
bool compile_glsl_to_spv(std::string& shader, program_domain domain, std::vector<u32> &spv);
|
bool compile_glsl_to_spv(std::string& shader, program_domain domain, std::vector<u32> &spv);
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ std::string VKFragmentDecompilerThread::getFloatTypeName(size_t elementCount)
|
||||||
|
|
||||||
std::string VKFragmentDecompilerThread::getFunction(FUNCTION f)
|
std::string VKFragmentDecompilerThread::getFunction(FUNCTION f)
|
||||||
{
|
{
|
||||||
return vk::getFunctionImpl(f);
|
return glsl::getFunctionImpl(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string VKFragmentDecompilerThread::saturate(const std::string & code)
|
std::string VKFragmentDecompilerThread::saturate(const std::string & code)
|
||||||
|
|
|
@ -15,10 +15,9 @@ std::string VKVertexDecompilerThread::getIntTypeName(size_t elementCount)
|
||||||
return "ivec4";
|
return "ivec4";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string VKVertexDecompilerThread::getFunction(FUNCTION f)
|
std::string VKVertexDecompilerThread::getFunction(FUNCTION f)
|
||||||
{
|
{
|
||||||
return vk::getFunctionImpl(f);
|
return glsl::getFunctionImpl(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string VKVertexDecompilerThread::compareFunction(COMPARE f, const std::string &Op0, const std::string &Op1)
|
std::string VKVertexDecompilerThread::compareFunction(COMPARE f, const std::string &Op0, const std::string &Op1)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue