Permalink
Browse files

[spline/bezier]Improve shader uniforms a bit.

  • Loading branch information...
xebra committed Jul 14, 2018
1 parent de5975f commit d4a667397c9950d8112b70e9c55c04dd69ea9b9e
@@ -240,7 +240,7 @@ void BaseUpdateUniforms(UB_VS_FS_Base *ub, uint64_t dirtyUniforms, bool flipView
}
if (dirtyUniforms & DIRTY_BEZIERSPLINE) {
ub->spline_counts = BytesToUint32(gstate_c.spline_num_patches_u, gstate_c.spline_num_patches_v, gstate_c.spline_tess_u, gstate_c.spline_tess_v);
ub->spline_counts = BytesToUint32(gstate_c.spline_num_patches_u, gstate_c.spline_num_points_u, gstate_c.spline_tess_u, gstate_c.spline_tess_v);
}
if (dirtyUniforms & DIRTY_DEPAL) {
@@ -309,12 +309,12 @@ void GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage
WRITE(p, "};\n");
WRITE(p, "void tessellate(in VS_IN In, out Tess tess) {\n");
WRITE(p, " int2 spline_num_patches = int2((u_spline_counts >> 0) & 0xFF, (u_spline_counts >> 8) & 0xFF);\n");
WRITE(p, " int spline_num_patches_u = int(u_spline_counts & 0xff);\n");
WRITE(p, " int spline_num_points_u = int((u_spline_counts >> 8) & 0xff);\n");
WRITE(p, " int2 spline_tess = int2((u_spline_counts >> 16) & 0xFF, (u_spline_counts >> 24) & 0xFF);\n");
// Calculate current patch position and vertex position(index for the weights)
WRITE(p, " int spline_count_u = %s;\n", doBezier ? "spline_num_patches.x * 3 + 1" : "spline_num_patches.x + 3");
WRITE(p, " int u = In.instanceId %% spline_num_patches.x;\n");
WRITE(p, " int v = In.instanceId / spline_num_patches.x;\n");
WRITE(p, " int u = In.instanceId %% spline_num_patches_u;\n");
WRITE(p, " int v = In.instanceId / spline_num_patches_u;\n");
WRITE(p, " int2 patch_pos = int2(u, v);\n");
WRITE(p, " int2 vertex_pos = int2(In.position.xy);\n");
if (doSpline) {
@@ -329,7 +329,7 @@ void GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage
WRITE(p, " int index;\n");
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
WRITE(p, " index = (%i + v%s) * spline_count_u + (%i + u%s);\n", i, doBezier ? " * 3" : "", j, doBezier ? " * 3" : "");
WRITE(p, " index = (%i + v%s) * spline_num_points_u + (%i + u%s);\n", i, doBezier ? " * 3" : "", j, doBezier ? " * 3" : "");
WRITE(p, " _pos[%i] = tess_data[index].pos;\n", i * 4 + j);
if (doTexture && hasTexcoord && hasTexcoordTess)
WRITE(p, " _tex[%i] = tess_data[index].tex;\n", i * 4 + j);
@@ -163,7 +163,7 @@ LinkedShader::LinkedShader(GLRenderManager *render, VShaderID VSID, Shader *vs,
queries.push_back({ &u_tess_weights_u, "u_tess_weights_u" });
queries.push_back({ &u_tess_weights_v, "u_tess_weights_v" });
queries.push_back({ &u_spline_tess, "u_spline_tess" });
queries.push_back({ &u_spline_num_patches, "u_spline_num_patches" });
queries.push_back({ &u_spline_counts, "u_spline_counts" });
queries.push_back({ &u_depal, "u_depal" });
attrMask = vs->GetAttrMask();
@@ -569,9 +569,9 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid) {
int tess[] = { gstate_c.spline_tess_u, gstate_c.spline_tess_v };
render_->SetUniformI(&u_spline_tess, 2, tess);
}
if (u_spline_num_patches != -1) {
int num_patches[] = { gstate_c.spline_num_patches_u, gstate_c.spline_num_patches_v };
render_->SetUniformI(&u_spline_num_patches, 2, num_patches);
if (u_spline_counts != -1) {
int counts[] = { gstate_c.spline_num_patches_u, gstate_c.spline_num_points_u };
render_->SetUniformI(&u_spline_counts, 2, counts);
}
}
}
@@ -122,7 +122,7 @@ class LinkedShader {
int u_tess_weights_u;
int u_tess_weights_v;
int u_spline_tess;
int u_spline_num_patches;
int u_spline_counts;
};
// Real public interface
@@ -383,7 +383,7 @@ void GenerateVertexShader(const VShaderID &id, char *buffer, uint32_t *attrMask,
WRITE(p, "uniform sampler2D u_tess_weights_u;\n");
WRITE(p, "uniform sampler2D u_tess_weights_v;\n");
WRITE(p, "uniform ivec2 u_spline_num_patches;\n");
WRITE(p, "uniform ivec2 u_spline_counts;\n");
WRITE(p, "uniform ivec2 u_spline_tess;\n");
for (int i = 2; i <= 4; i++) {
@@ -412,10 +412,11 @@ void GenerateVertexShader(const VShaderID &id, char *buffer, uint32_t *attrMask,
WRITE(p, "};\n");
WRITE(p, "void tessellate(out Tess tess) {\n");
WRITE(p, " int spline_num_patches_u = u_spline_counts[0];\n");
WRITE(p, " int spline_num_points_u = u_spline_counts[1];\n");
// Calculate current patch position and vertex position(index for the weights)
WRITE(p, " int spline_count_u = %s;\n", doBezier ? "u_spline_num_patches.x * 3 + 1" : "u_spline_num_patches.x + 3");
WRITE(p, " int u = gl_InstanceID %% u_spline_num_patches.x;\n");
WRITE(p, " int v = gl_InstanceID / u_spline_num_patches.x;\n");
WRITE(p, " int u = gl_InstanceID %% spline_num_patches_u;\n");
WRITE(p, " int v = gl_InstanceID / spline_num_patches_u;\n");
WRITE(p, " ivec2 patch_pos = ivec2(u, v);\n");
WRITE(p, " ivec2 vertex_pos = ivec2(position.xy);\n");
if (doSpline) {
@@ -429,7 +430,7 @@ void GenerateVertexShader(const VShaderID &id, char *buffer, uint32_t *attrMask,
WRITE(p, " vec4 _col[16];\n");
WRITE(p, " for (int i = 0; i < 4; i++) {\n");
WRITE(p, " for (int j = 0; j < 4; j++) {\n");
WRITE(p, " int index = (i + v%s) * spline_count_u + (j + u%s);\n", doBezier ? " * 3" : "", doBezier ? " * 3" : "");
WRITE(p, " int index = (i + v%s) * spline_num_points_u + (j + u%s);\n", doBezier ? " * 3" : "", doBezier ? " * 3" : "");
WRITE(p, " _pos[i * 4 + j] = %s(u_tess_points, ivec2(index, 0), 0).xyz;\n", texelFetch);
if (doTexture && hasTexcoord && hasTexcoordTess)
WRITE(p, " _tex[i * 4 + j] = %s(u_tess_points, ivec2(index, 1), 0).xy;\n", texelFetch);
@@ -1761,9 +1761,12 @@ void GPUCommon::Execute_Bezier(u32 op, u32 diff) {
gstate_c.Dirty(DIRTY_VERTEXSHADER_STATE);
gstate_c.bezier = true;
int num_patches_u = (bz_ucount - 1) / 3;
if (gstate_c.spline_num_patches_u != num_patches_u) {
bool patchesChanged = gstate_c.spline_num_patches_u != num_patches_u;
bool countsChanged = gstate_c.spline_num_points_u != bz_ucount;
if (patchesChanged || countsChanged) {
gstate_c.Dirty(DIRTY_BEZIERSPLINE);
gstate_c.spline_num_patches_u = num_patches_u;
gstate_c.spline_num_points_u = bz_ucount;
}
}
@@ -1828,15 +1831,15 @@ void GPUCommon::Execute_Spline(u32 op, u32 diff) {
int tess_u = gstate.getPatchDivisionU();
int tess_v = gstate.getPatchDivisionV();
int num_patches_u = sp_ucount - 3;
int num_patches_v = sp_vcount - 3;
bool divsChanged = gstate_c.spline_tess_u != tess_u || gstate_c.spline_tess_v != tess_v;
bool patchesChanged = gstate_c.spline_num_patches_u != num_patches_u || gstate_c.spline_num_patches_v != num_patches_v;
if (divsChanged || patchesChanged) {
bool patchesChanged = gstate_c.spline_num_patches_u != num_patches_u;
bool countsChanged = gstate_c.spline_num_points_u != sp_ucount;
if (divsChanged || patchesChanged || countsChanged) {
gstate_c.Dirty(DIRTY_BEZIERSPLINE);
gstate_c.spline_tess_u = tess_u;
gstate_c.spline_tess_v = tess_v;
gstate_c.spline_num_patches_u = num_patches_u;
gstate_c.spline_num_patches_v = num_patches_v;
gstate_c.spline_num_points_u = sp_ucount;
}
}
@@ -605,7 +605,7 @@ struct GPUStateCache {
int spline_tess_u;
int spline_tess_v;
int spline_num_patches_u;
int spline_num_patches_v;
int spline_num_points_u;
bool useShaderDepal;
GEBufferFormat depalFramebufferFormat;
@@ -261,13 +261,12 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) {
WRITE(p, "};\n");
WRITE(p, "void tessellate(out Tess tess) {\n");
// Calculate current patch position and vertex position(index for the weights)
WRITE(p, " ivec2 spline_num_patches = ivec2((base.spline_counts >> 0) & 0xff, (base.spline_counts >> 8) & 0xff);\n");
WRITE(p, " int spline_num_patches_u = int(base.spline_counts & 0xff);\n");
WRITE(p, " int spline_num_points_u = int((base.spline_counts >> 8) & 0xff);\n");
WRITE(p, " ivec2 spline_tess = ivec2((base.spline_counts >> 16) & 0xff, (base.spline_counts >> 24) & 0xff);\n");
WRITE(p, " int spline_count_u = %s;\n", doBezier ? "spline_num_patches.x * 3 + 1" : "spline_num_patches.x + 3");
WRITE(p, " int u = gl_InstanceIndex %% spline_num_patches.x;\n");
WRITE(p, " int v = gl_InstanceIndex / spline_num_patches.x;\n");
// Calculate current patch position and vertex position(index for the weights)
WRITE(p, " int u = gl_InstanceIndex %% spline_num_patches_u;\n");
WRITE(p, " int v = gl_InstanceIndex / spline_num_patches_u;\n");
WRITE(p, " ivec2 patch_pos = ivec2(u, v);\n");
WRITE(p, " ivec2 vertex_pos = ivec2(position.xy);\n");
if (doSpline) {
@@ -281,7 +280,7 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) {
WRITE(p, " vec4 _col[16];\n");
WRITE(p, " for (int i = 0; i < 4; i++) {\n");
WRITE(p, " for (int j = 0; j < 4; j++) {\n");
WRITE(p, " int idx = (i + v%s) * spline_count_u + (j + u%s);\n", doBezier ? " * 3" : "", doBezier ? " * 3" : "");
WRITE(p, " int idx = (i + v%s) * spline_num_points_u + (j + u%s);\n", doBezier ? " * 3" : "", doBezier ? " * 3" : "");
WRITE(p, " _pos[i * 4 + j] = tess_data.data[idx].pos.xyz;\n");
if (doTexture && hasTexcoord && hasTexcoordTess)
WRITE(p, " _tex[i * 4 + j] = tess_data.data[idx].uv.xy;\n");

0 comments on commit d4a6673

Please sign in to comment.