diff --git a/port/fast3d/gfx_api.h b/port/fast3d/gfx_api.h index 279a684ef..f79c4075d 100644 --- a/port/fast3d/gfx_api.h +++ b/port/fast3d/gfx_api.h @@ -44,7 +44,7 @@ void gfx_start_frame(void); void gfx_run(Gfx* commands); void gfx_end_frame(void); void gfx_set_target_fps(int); -void gfx_set_maximum_frame_latency(int latency); +void gfx_set_texture_filter(enum FilteringMode mode); void gfx_texture_cache_clear(void); void gfx_texture_cache_delete(const uint8_t *orig_addr); int gfx_create_framebuffer(uint32_t width, uint32_t height, int upscale, int autoresize); @@ -52,7 +52,5 @@ void gfx_resize_framebuffer(int fb, uint32_t width, uint32_t height, int upscale void gfx_set_framebuffer(int fb, float noise_scale) ; void gfx_reset_framebuffer(void); void gfx_copy_framebuffer(int fb_dst, int fb_src, int left, int top, int use_back); -void gfx_get_pixel_depth_prepare(float x, float y); -uint16_t gfx_get_pixel_depth(float x, float y); #endif diff --git a/port/fast3d/gfx_opengl.cpp b/port/fast3d/gfx_opengl.cpp index ddd51f067..0f9ee081b 100644 --- a/port/fast3d/gfx_opengl.cpp +++ b/port/fast3d/gfx_opengl.cpp @@ -97,10 +97,10 @@ static void gfx_opengl_set_uniforms(struct ShaderProgram* prg) { glUniform1f(prg->noise_scale_location, current_noise_scale); } if (prg->three_point_filter_locations[0] >= 0) { - glUniform1i(prg->three_point_filter_locations[0], current_filter_mode == FILTER_THREE_POINT && current_linear_filters[0]); + glUniform1i(prg->three_point_filter_locations[0], current_linear_filters[0]); } if (prg->three_point_filter_locations[1] >= 0) { - glUniform1i(prg->three_point_filter_locations[1], current_filter_mode == FILTER_THREE_POINT && current_linear_filters[1]); + glUniform1i(prg->three_point_filter_locations[1], current_linear_filters[1]); } } @@ -377,11 +377,13 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad } if (cc_features.used_textures[0]) { append_line(fs_buf, &fs_len, "uniform sampler2D uTex0;"); - append_line(fs_buf, &fs_len, "uniform int three_point_filter0;"); + if (current_filter_mode == FILTER_THREE_POINT) + append_line(fs_buf, &fs_len, "uniform int three_point_filter0;"); } if (cc_features.used_textures[1]) { append_line(fs_buf, &fs_len, "uniform sampler2D uTex1;"); - append_line(fs_buf, &fs_len, "uniform int three_point_filter1;"); + if (current_filter_mode == FILTER_THREE_POINT) + append_line(fs_buf, &fs_len, "uniform int three_point_filter1;"); } append_line(fs_buf, &fs_len, "uniform int frame_count;"); @@ -407,7 +409,7 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad return vec4(cw.rgb / cw.a, 1.0); })" ); - } else { + } else if (current_filter_mode == FILTER_THREE_POINT) { #if __APPLE__ append_line(fs_buf, &fs_len, "#define TEX_OFFSET(off) texture(tex, texCoord - (off)/texSize)"); #else @@ -426,6 +428,14 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad append_line(fs_buf, &fs_len, " return three_point_filter == 1 ? filter3point(tex, uv, texSize) : texture(tex, uv);"); #else append_line(fs_buf, &fs_len, " return three_point_filter == 1 ? filter3point(tex, uv, texSize) : texture2D(tex, uv);"); +#endif + append_line(fs_buf, &fs_len, "}"); + } else { + append_line(fs_buf, &fs_len, "vec4 hookTexture2D(in sampler2D tex, in vec2 uv, in vec2 texSize, in int three_point_filter) {"); +#if __APPLE__ + append_line(fs_buf, &fs_len, " return texture(tex, uv);"); +#else + append_line(fs_buf, &fs_len, " return texture2D(tex, uv);"); #endif append_line(fs_buf, &fs_len, "}"); } @@ -467,7 +477,10 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad } } - fs_len += sprintf(fs_buf + fs_len, "vec4 texVal%d = hookTexture2D(uTex%d, vTexCoordAdj%d, texSize%d, three_point_filter%d);\n", i, i, i, i, i); + if (current_filter_mode == FILTER_THREE_POINT) + fs_len += sprintf(fs_buf + fs_len, "vec4 texVal%d = hookTexture2D(uTex%d, vTexCoordAdj%d, texSize%d, three_point_filter%d);\n", i, i, i, i, i); + else + fs_len += sprintf(fs_buf + fs_len, "vec4 texVal%d = hookTexture2D(uTex%d, vTexCoordAdj%d, texSize%d, 0);\n", i, i, i, i); } } @@ -580,6 +593,9 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad glAttachShader(shader_program, fragment_shader); glLinkProgram(shader_program); + glDeleteShader(vertex_shader); + glDeleteShader(fragment_shader); + size_t cnt = 0; struct ShaderProgram* prg = &shader_program_pool[make_pair(shader_id0, shader_id1)]; @@ -665,6 +681,14 @@ static void gfx_opengl_shader_get_info(struct ShaderProgram* prg, uint8_t* num_i used_textures[1] = prg->used_textures[1]; } +static void gfx_opengl_clear_shaders(void) { + glUseProgram(0); + for (auto& pair : shader_program_pool) { + glDeleteProgram(pair.second.opengl_program_id); + } + shader_program_pool.clear(); +} + static GLuint gfx_opengl_new_texture(void) { GLuint ret; glGenTextures(1, &ret); @@ -1177,7 +1201,6 @@ void gfx_opengl_copy_framebuffer(int fb_dst, int fb_src, int left, int top, bool void gfx_opengl_set_texture_filter(FilteringMode mode) { current_filter_mode = mode; - gfx_texture_cache_clear(); } FilteringMode gfx_opengl_get_texture_filter(void) { @@ -1193,6 +1216,7 @@ struct GfxRenderingAPI gfx_opengl_api = { gfx_opengl_create_and_load_new_shader, gfx_opengl_lookup_shader, gfx_opengl_shader_get_info, + gfx_opengl_clear_shaders, gfx_opengl_new_texture, gfx_opengl_select_texture, gfx_opengl_upload_texture, diff --git a/port/fast3d/gfx_pc.cpp b/port/fast3d/gfx_pc.cpp index c0b4bcaca..798cef32f 100644 --- a/port/fast3d/gfx_pc.cpp +++ b/port/fast3d/gfx_pc.cpp @@ -2705,6 +2705,18 @@ extern "C" void gfx_set_target_fps(int fps) { gfx_wapi->set_target_fps(fps); } +extern "C" void gfx_set_texture_filter(enum FilteringMode mode) { + gfx_texture_cache_clear(); + if (rendering_state.shader_program) { + gfx_rapi->unload_shader(rendering_state.shader_program); + rendering_state.shader_program = nullptr; + } + gfx_rapi->clear_shaders(); + color_combiner_pool.clear(); + prev_combiner = color_combiner_pool.end(); + gfx_rapi->set_texture_filter(mode); +} + extern "C" int gfx_create_framebuffer(uint32_t width, uint32_t height, int upscale, int autoresize) { int fb = gfx_rapi->create_framebuffer(); gfx_resize_framebuffer(fb, width, height, upscale, autoresize); diff --git a/port/fast3d/gfx_rendering_api.h b/port/fast3d/gfx_rendering_api.h index d077c1682..2b499479c 100644 --- a/port/fast3d/gfx_rendering_api.h +++ b/port/fast3d/gfx_rendering_api.h @@ -23,6 +23,7 @@ struct GfxRenderingAPI { struct ShaderProgram* (*create_and_load_new_shader)(uint64_t shader_id0, uint32_t shader_id1); struct ShaderProgram* (*lookup_shader)(uint64_t shader_id0, uint32_t shader_id1); void (*shader_get_info)(struct ShaderProgram* prg, uint8_t* num_inputs, bool used_textures[2]); + void (*clear_shaders)(void); uint32_t (*new_texture)(void); void (*select_texture)(int tile, uint32_t texture_id, bool linear_filter); void (*upload_texture)(const uint8_t* rgba32_buf, uint32_t width, uint32_t height); diff --git a/port/src/video.c b/port/src/video.c index 181af3ab5..3befff9fb 100644 --- a/port/src/video.c +++ b/port/src/video.c @@ -77,7 +77,7 @@ s32 videoInit(void) } wmAPI->set_target_fps(vidFramerateLimit); // disabled because vsync is on - renderingAPI->set_texture_filter((enum FilteringMode)texFilter); + gfx_set_texture_filter((enum FilteringMode)texFilter); initDone = true; return 0; @@ -219,7 +219,7 @@ void videoSetTextureFilter(u32 filter) { if (filter > FILTER_THREE_POINT) filter = FILTER_THREE_POINT; texFilter = filter; - renderingAPI->set_texture_filter((enum FilteringMode)filter); + gfx_set_texture_filter((enum FilteringMode)filter); } void videoSetTextureFilter2D(s32 filter)