Detect 2-cycle and when to apply optimizations

This commit is contained in:
MysterD 2023-04-26 21:05:32 -07:00
parent 8840649887
commit 9f269ba7dd
3 changed files with 26 additions and 12 deletions

View file

@ -71,6 +71,7 @@ struct CombineMode {
uint8_t use_fog : 1; uint8_t use_fog : 1;
uint8_t texture_edge : 1; uint8_t texture_edge : 1;
uint8_t use_noise : 1; uint8_t use_noise : 1;
uint8_t use_2cycle : 1;
}; };
uint32_t flags; uint32_t flags;
}; };

View file

@ -215,17 +215,18 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(struct ColorC
bool opt_alpha = cc->cm.use_alpha; bool opt_alpha = cc->cm.use_alpha;
bool opt_fog = cc->cm.use_fog; bool opt_fog = cc->cm.use_fog;
bool opt_texture_edge = cc->cm.texture_edge; bool opt_texture_edge = cc->cm.texture_edge;
bool opt_2cycle = cc->cm.use_2cycle;
#ifdef USE_GLES #ifdef USE_GLES
bool opt_noise = false; bool opt_noise = false;
#else #else
bool opt_noise = cc->cm.use_noise; bool opt_noise = cc->cm.use_noise;
#endif #endif
u8* cmd = cc->shader_commands;
bool used_textures[2] = { 0 }; bool used_textures[2] = { 0 };
int num_inputs = 0; int num_inputs = 0;
for (int i = 0; i < SHADER_CMD_LENGTH; i++) { int cmd_length = opt_2cycle ? 16 : 8;
u8 c = cmd[i]; for (int i = 0; i < cmd_length; i++) {
u8 c = cc->shader_commands[i];
if (c >= SHADER_INPUT_1 && c <= SHADER_INPUT_4) { if (c >= SHADER_INPUT_1 && c <= SHADER_INPUT_4) {
if (c > num_inputs) { num_inputs = c; } if (c > num_inputs) { num_inputs = c; }
} }
@ -233,10 +234,19 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(struct ColorC
used_textures[1] = used_textures[1] || c == SHADER_TEXEL1 || c == SHADER_TEXEL1A; used_textures[1] = used_textures[1] || c == SHADER_TEXEL1 || c == SHADER_TEXEL1A;
} }
bool do_single[2] = { cmd[0 * 4 + 2] == 0, cmd[1 * 4 + 2] == 0 }; u8* cmd = cc->shader_commands;
bool do_multiply[2] = { cmd[0 * 4 + 1] == 0 && cmd[0 * 4 + 3] == 0, cmd[1 * 4 + 1] == 0 && cmd[1 * 4 + 3] == 0 };
bool do_mix[2] = { cmd[0 * 4 + 1] == cmd[0 * 4 + 3], cmd[1 * 4 + 1] == cmd[1 * 4 + 3] }; // figure out optimizations
bool color_alpha_same = false; // TODO: gotta check shader comamndssadasda bool do_single[4] = { 0 };
bool do_multiply[4] = { 0 };
bool do_mix[4] = { 0 };
bool color_alpha_same[2] = { 0 }; // TODO: gotta compare shader commands
for (int i = 0; i < 16 / 4; i++) {
u8* c = &cc->shader_commands[i * 4];
do_single[i] = (c[2] == 0);
do_multiply[i] = (c[1] == c[3]);
do_mix[i] = (c[1] == c[3]);
}
char vs_buf[1024]; char vs_buf[1024];
char fs_buf[2048]; char fs_buf[2048];
@ -354,7 +364,7 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(struct ColorC
} }
append_str(fs_buf, &fs_len, opt_alpha ? "vec4 texel = " : "vec3 texel = "); append_str(fs_buf, &fs_len, opt_alpha ? "vec4 texel = " : "vec3 texel = ");
if (!color_alpha_same && opt_alpha) { if (!color_alpha_same[0] && opt_alpha) {
append_str(fs_buf, &fs_len, "vec4("); append_str(fs_buf, &fs_len, "vec4(");
append_formula(fs_buf, &fs_len, cmd, do_single[0], do_multiply[0], do_mix[0], false, false, true); append_formula(fs_buf, &fs_len, cmd, do_single[0], do_multiply[0], do_mix[0], false, false, true);
append_str(fs_buf, &fs_len, ", "); append_str(fs_buf, &fs_len, ", ");
@ -368,7 +378,9 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(struct ColorC
if (opt_texture_edge && opt_alpha) { if (opt_texture_edge && opt_alpha) {
append_line(fs_buf, &fs_len, "if (texel.a > 0.3) texel.a = 1.0; else discard;"); append_line(fs_buf, &fs_len, "if (texel.a > 0.3) texel.a = 1.0; else discard;");
} }
// TODO discard if alpha is 0? // TODO discard if alpha is 0?
if (opt_fog) { if (opt_fog) {
if (opt_alpha) { if (opt_alpha) {
append_line(fs_buf, &fs_len, "texel = vec4(mix(texel.rgb, vFog.rgb, vFog.a), texel.a);"); append_line(fs_buf, &fs_len, "texel = vec4(mix(texel.rgb, vFog.rgb, vFog.a), texel.a);");

View file

@ -1011,6 +1011,7 @@ static void OPTIMIZE_O3 gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t
cm->use_alpha = (rdp.other_mode_l & (G_BL_A_MEM << 18)) == 0; cm->use_alpha = (rdp.other_mode_l & (G_BL_A_MEM << 18)) == 0;
cm->texture_edge = (rdp.other_mode_l & CVG_X_ALPHA) == CVG_X_ALPHA; cm->texture_edge = (rdp.other_mode_l & CVG_X_ALPHA) == CVG_X_ALPHA;
cm->use_noise = (rdp.other_mode_l & G_AC_DITHER) == G_AC_DITHER; cm->use_noise = (rdp.other_mode_l & G_AC_DITHER) == G_AC_DITHER;
cm->use_2cycle = (rdp.other_mode_h & (3U << G_MDSFT_CYCLETYPE)) == G_CYC_2CYCLE;
cm->use_fog = (rdp.other_mode_l >> 30) == G_BL_CLR_FOG; cm->use_fog = (rdp.other_mode_l >> 30) == G_BL_CLR_FOG;
if (cm->texture_edge) { if (cm->texture_edge) {