(shaders) Avoid certain shader types when context isn't compatible.

@bparker06 to the rescue.
This commit is contained in:
r5 2017-09-18 03:46:17 +01:00
parent 23fe08cb4b
commit 4a9325d01d
3 changed files with 44 additions and 4 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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;
}
}
/**