diff --git a/src/pc/gfx/gfx_cc.h b/src/pc/gfx/gfx_cc.h index 1b49e16c..abf5ccd6 100644 --- a/src/pc/gfx/gfx_cc.h +++ b/src/pc/gfx/gfx_cc.h @@ -71,6 +71,7 @@ struct CombineMode { uint8_t use_fog : 1; uint8_t texture_edge : 1; uint8_t use_noise : 1; + uint8_t use_2cycle : 1; }; uint32_t flags; }; diff --git a/src/pc/gfx/gfx_opengl.c b/src/pc/gfx/gfx_opengl.c index 80dc7ef7..9021b5be 100644 --- a/src/pc/gfx/gfx_opengl.c +++ b/src/pc/gfx/gfx_opengl.c @@ -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_fog = cc->cm.use_fog; bool opt_texture_edge = cc->cm.texture_edge; + bool opt_2cycle = cc->cm.use_2cycle; #ifdef USE_GLES bool opt_noise = false; #else bool opt_noise = cc->cm.use_noise; #endif - u8* cmd = cc->shader_commands; bool used_textures[2] = { 0 }; int num_inputs = 0; - for (int i = 0; i < SHADER_CMD_LENGTH; i++) { - u8 c = cmd[i]; + int cmd_length = opt_2cycle ? 16 : 8; + 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 > 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; } - bool do_single[2] = { cmd[0 * 4 + 2] == 0, cmd[1 * 4 + 2] == 0 }; - 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] }; - bool color_alpha_same = false; // TODO: gotta check shader comamndssadasda + u8* cmd = cc->shader_commands; + + // figure out optimizations + 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 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 = "); - if (!color_alpha_same && opt_alpha) { + if (!color_alpha_same[0] && opt_alpha) { 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_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) { append_line(fs_buf, &fs_len, "if (texel.a > 0.3) texel.a = 1.0; else discard;"); } + // TODO discard if alpha is 0? + if (opt_fog) { if (opt_alpha) { append_line(fs_buf, &fs_len, "texel = vec4(mix(texel.rgb, vFog.rgb, vFog.a), texel.a);"); diff --git a/src/pc/gfx/gfx_pc.c b/src/pc/gfx/gfx_pc.c index ed27af17..047c7c03 100644 --- a/src/pc/gfx/gfx_pc.c +++ b/src/pc/gfx/gfx_pc.c @@ -1008,10 +1008,11 @@ static void OPTIMIZE_O3 gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t struct CombineMode* cm = &rdp.combine_mode; - 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->use_noise = (rdp.other_mode_l & G_AC_DITHER) == G_AC_DITHER; - cm->use_fog = (rdp.other_mode_l >> 30) == G_BL_CLR_FOG; + 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->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; if (cm->texture_edge) { cm->use_alpha = true;