diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 0d9d00740f..f5396f3509 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -212,6 +212,8 @@ static gfx_ctx_driver_t current_video_context; static void *video_context_data = NULL; +static enum gfx_ctx_api current_video_context_api = GFX_CTX_NONE; + shader_backend_t *current_shader = NULL; void *shader_data = NULL; @@ -2718,6 +2720,9 @@ static const gfx_ctx_driver_t *video_context_driver_init( video_info.shared_context && hw_render_ctx); video_context_driver_set_data(ctx_data); + + current_video_context_api = api; + return ctx; } @@ -3012,6 +3017,11 @@ bool video_context_driver_set_flags(gfx_ctx_flags_t *flags) return true; } +enum gfx_ctx_api video_context_driver_get_api(void) +{ + return current_video_context_api; +} + bool video_driver_has_windowed(void) { #if defined(RARCH_CONSOLE) || defined(RARCH_MOBILE) diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 1bf7965e5e..1172dc978a 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -1208,6 +1208,8 @@ bool video_context_driver_translate_aspect(gfx_ctx_aspect_t *aspect); bool video_context_driver_input_driver(gfx_ctx_input_t *inp); +enum gfx_ctx_api video_context_driver_get_api(void); + void video_context_driver_free(void); bool video_shader_driver_get_prev_textures(video_shader_ctx_texture_t *texture); diff --git a/gfx/video_shader_parse.c b/gfx/video_shader_parse.c index 0f1f22710e..81ea705fb5 100644 --- a/gfx/video_shader_parse.c +++ b/gfx/video_shader_parse.c @@ -1083,23 +1083,51 @@ enum rarch_shader_type video_shader_parse_type(const char *path, if (!path) return fallback; + enum rarch_shader_type shader_type = RARCH_SHADER_NONE; switch (msg_hash_to_file_type( msg_hash_calculate(path_get_extension(path)))) { + case FILE_TYPE_SHADER_CG: case FILE_TYPE_SHADER_PRESET_CGP: - return RARCH_SHADER_CG; + shader_type = RARCH_SHADER_CG; + break; case FILE_TYPE_SHADER_GLSL: case FILE_TYPE_SHADER_PRESET_GLSLP: - return RARCH_SHADER_GLSL; + shader_type = RARCH_SHADER_GLSL; + break; case FILE_TYPE_SHADER_SLANG: case FILE_TYPE_SHADER_PRESET_SLANGP: - return RARCH_SHADER_SLANG; + shader_type = RARCH_SHADER_SLANG; + break; default: break; } - return fallback; + enum gfx_ctx_api api = video_context_driver_get_api(); + + + switch (api) + { + case GFX_CTX_OPENGL_API: + if (shader_type == RARCH_SHADER_GLSL || shader_type == RARCH_SHADER_CG) + return shader_type; + case GFX_CTX_OPENGL_ES_API: + if (shader_type == RARCH_SHADER_GLSL) + return shader_type; + case GFX_CTX_DIRECT3D9_API: + if (shader_type == RARCH_SHADER_CG) + return shader_type; + case GFX_CTX_VULKAN_API: + if (shader_type == RARCH_SHADER_SLANG) + return fallback; + case GFX_CTX_NONE: + case GFX_CTX_GDI_API: + case GFX_CTX_OPENVG_API: + case GFX_CTX_DIRECT3D8_API: + default: + return fallback; + } } /**