diff --git a/gfx/video_shader_driver.c b/gfx/video_shader_driver.c index 37d301eda2..bd52b25739 100644 --- a/gfx/video_shader_driver.c +++ b/gfx/video_shader_driver.c @@ -58,18 +58,6 @@ const shader_backend_t *shader_ctx_find_driver(const char *ident) return NULL; } -struct video_shader *video_shader_driver_get_current_shader(void) -{ - void *video_driver = video_driver_get_ptr(false); - const video_poke_interface_t *video_poke = video_driver_get_poke(); - if (!video_poke || !video_driver) - return NULL; - if (!video_poke->get_current_shader) - return NULL; - return video_poke->get_current_shader(video_driver); -} - - const char *video_shader_driver_get_ident(void) { if (!current_shader) @@ -88,6 +76,20 @@ bool video_shader_driver_ctl(enum video_shader_driver_ctl_state state, void *dat { switch (state) { + case SHADER_CTL_GET_CURRENT_SHADER: + { + video_shader_ctx_t *shader = (video_shader_ctx_t*)data; + void *video_driver = video_driver_get_ptr(false); + const video_poke_interface_t *video_poke = video_driver_get_poke(); + + shader->data = NULL; + if (!video_poke || !video_driver) + return false; + if (!video_poke->get_current_shader) + return false; + shader->data = video_poke->get_current_shader(video_driver); + } + break; case SHADER_CTL_DIRECT_GET_CURRENT_SHADER: { video_shader_ctx_t *shader = (video_shader_ctx_t*)data; diff --git a/gfx/video_shader_driver.h b/gfx/video_shader_driver.h index 8d022ad779..a8f1a2c668 100644 --- a/gfx/video_shader_driver.h +++ b/gfx/video_shader_driver.h @@ -70,6 +70,7 @@ enum video_shader_driver_ctl_state SHADER_CTL_FILTER_TYPE, SHADER_CTL_USE, SHADER_CTL_WRAP_TYPE, + SHADER_CTL_GET_CURRENT_SHADER, SHADER_CTL_DIRECT_GET_CURRENT_SHADER }; @@ -190,8 +191,6 @@ extern const shader_backend_t shader_null_backend; **/ const shader_backend_t *shader_ctx_find_driver(const char *ident); -struct video_shader *video_shader_driver_get_current_shader(void); - const char *video_shader_driver_get_ident(void); unsigned video_shader_driver_get_prev_textures(void); diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 9b074ba0d6..50fd56410d 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -252,20 +252,20 @@ static void menu_action_setting_disp_set_label_shader_parameter( char *s2, size_t len2) { #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) + video_shader_ctx_t shader_info; const struct video_shader_parameter *param = NULL; - struct video_shader *shader = NULL; #endif *s = '\0'; *w = 19; strlcpy(s2, path, len2); #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) - shader = video_shader_driver_get_current_shader(); + video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); - if (!shader) + if (!shader_info.data) return; - param = &shader->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; + param = &shader_info.data->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; if (!param) return; diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index edf341f554..6bfc3995c2 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -52,9 +52,13 @@ static int generic_shader_action_parameter_left( static int shader_action_parameter_left(unsigned type, const char *label, bool wraparound) { - struct video_shader *shader = video_shader_driver_get_current_shader(); - struct video_shader_parameter *param = &shader->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; - return generic_shader_action_parameter_left(shader, param, type, label, wraparound); + video_shader_ctx_t shader_info; + struct video_shader_parameter *param = NULL; + + video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + + param = &shader_info.data->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; + return generic_shader_action_parameter_left(shader_info.data, param, type, label, wraparound); } static int shader_action_parameter_preset_left(unsigned type, const char *label, diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 9adf72df20..209a8176d5 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -56,9 +56,13 @@ static int generic_shader_action_parameter_right( int shader_action_parameter_right(unsigned type, const char *label, bool wraparound) { - struct video_shader *shader = video_shader_driver_get_current_shader(); - struct video_shader_parameter *param = &shader->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; - return generic_shader_action_parameter_right(shader, param, type, label, wraparound); + video_shader_ctx_t shader_info; + struct video_shader_parameter *param = NULL; + + video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + + param = &shader_info.data->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; + return generic_shader_action_parameter_right(shader_info.data, param, type, label, wraparound); } int shader_action_parameter_preset_right(unsigned type, const char *label, diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c index bc6d4e38d7..26f9dd6aac 100644 --- a/menu/cbs/menu_cbs_start.c +++ b/menu/cbs/menu_cbs_start.c @@ -114,13 +114,16 @@ static int action_start_input_desc(unsigned type, const char *label) static int action_start_shader_action_parameter(unsigned type, const char *label) { #ifdef HAVE_SHADER_MANAGER + video_shader_ctx_t shader_info; struct video_shader_parameter *param = NULL; - struct video_shader *shader = video_shader_driver_get_current_shader(); - if (!shader) + video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + + if (!shader_info.data) return 0; - param = &shader->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; + param = &shader_info.data->parameters + [type - MENU_SETTINGS_SHADER_PARAMETER_0]; param->current = param->initial; param->current = min(max(param->minimum, param->current), param->maximum); diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index d3cd54d991..d1f28b3539 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -2569,10 +2569,10 @@ int menu_displaylist_push_list(menu_displaylist_info_t *info, unsigned type) { size_t i; menu_ctx_displaylist_t disp_list; - int ret = 0; #ifdef HAVE_SHADER_MANAGER - struct video_shader *shader = NULL; + video_shader_ctx_t shader_info; #endif + int ret = 0; rarch_system_info_t *system = NULL; core_info_list_t *list = NULL; menu_handle_t *menu = NULL; @@ -3014,11 +3014,13 @@ int menu_displaylist_push_list(menu_displaylist_info_t *info, unsigned type) case DISPLAYLIST_SHADER_PARAMETERS: case DISPLAYLIST_SHADER_PARAMETERS_PRESET: #ifdef HAVE_SHADER_MANAGER - shader = video_shader_driver_get_current_shader(); - if (shader) - ret = deferred_push_video_shader_parameters_common(info, shader, + video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + + if (shader_info.data) + ret = deferred_push_video_shader_parameters_common(info, shader_info.data, (type == DISPLAYLIST_SHADER_PARAMETERS) - ? MENU_SETTINGS_SHADER_PARAMETER_0 : MENU_SETTINGS_SHADER_PRESET_PARAMETER_0 + ? MENU_SETTINGS_SHADER_PARAMETER_0 + : MENU_SETTINGS_SHADER_PRESET_PARAMETER_0 ); else { diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index e26a698fa8..1281151461 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -118,13 +118,18 @@ static shader_dlg_t g_shader_dlg = {0}; static void shader_dlg_refresh_trackbar_label(int index) { + video_shader_ctx_t shader_info; char val_buffer[32] = {0}; - struct video_shader* shader = video_shader_driver_get_current_shader(); - if (floorf(shader->parameters[index].current) == shader->parameters[index].current) - snprintf(val_buffer, sizeof(val_buffer), "%.0f", shader->parameters[index].current); + video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); + + if (floorf(shader_info.data->parameters[index].current) + == shader_info.data->parameters[index].current) + snprintf(val_buffer, sizeof(val_buffer), "%.0f", + shader_info.data->parameters[index].current); else - snprintf(val_buffer, sizeof(val_buffer), "%.2f", shader->parameters[index].current); + snprintf(val_buffer, sizeof(val_buffer), "%.2f", + shader_info.data->parameters[index].current); SendMessage(g_shader_dlg.controls[index].trackbar.label_val, WM_SETTEXT, 0, (LPARAM)val_buffer); @@ -133,7 +138,9 @@ static void shader_dlg_refresh_trackbar_label(int index) static void shader_dlg_params_refresh(void) { int i; - struct video_shader* shader = video_shader_driver_get_current_shader(); + video_shader_ctx_t shader_info; + + video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); for (i = 0; i < GFX_MAX_PARAMETERS; i++) { @@ -146,7 +153,9 @@ static void shader_dlg_params_refresh(void) { case SHADER_PARAM_CTRL_CHECKBOX: { - bool checked = (shader->parameters[i].current == shader->parameters[i].maximum); + bool checked = + (shader_info.data->parameters[i].current == + shader_info.data->parameters[i].maximum); SendMessage(control->checkbox.hwnd, BM_SETCHECK, checked, 0); } break; @@ -155,9 +164,13 @@ static void shader_dlg_params_refresh(void) SendMessage(control->trackbar.hwnd, TBM_SETRANGEMIN, (WPARAM)TRUE, (LPARAM)0); SendMessage(control->trackbar.hwnd, TBM_SETRANGEMAX, (WPARAM)TRUE, - (LPARAM)((shader->parameters[i].maximum - shader->parameters[i].minimum) / shader->parameters[i].step)); + (LPARAM)((shader_info.data->parameters[i].maximum - + shader_info.data->parameters[i].minimum) + / shader_info.data->parameters[i].step)); SendMessage(control->trackbar.hwnd, TBM_SETPOS, (WPARAM)TRUE, - (LPARAM)((shader->parameters[i].current - shader->parameters[i].minimum) / shader->parameters[i].step)); + (LPARAM)((shader_info.data->parameters[i].current - + shader_info.data->parameters[i].minimum) / + shader_info.data->parameters[i].step)); break; case SHADER_PARAM_CTRL_NONE: default: @@ -200,25 +213,28 @@ void shader_dlg_params_reload(void) HFONT hFont; RECT parent_rect; int i, pos_x, pos_y; - struct video_shader* shader = video_shader_driver_get_current_shader(); + video_shader_ctx_t shader_info; + + video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); shader_dlg_params_clear(); - if (!shader) + if (!shader_info.data) return; - if (shader->num_parameters > GFX_MAX_PARAMETERS) + if (shader_info.data->num_parameters > GFX_MAX_PARAMETERS) return; hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); pos_y = g_shader_dlg.parameters_start_y; pos_x = SHADER_DLG_CTRL_X; - for (i = 0; i < (int)shader->num_parameters; i++) + for (i = 0; i < (int)shader_info.data->num_parameters; i++) { shader_param_ctrl_t*control = &g_shader_dlg.controls[i]; - if ((shader->parameters[i].minimum == 0.0) - && (shader->parameters[i].maximum == (shader->parameters[i].minimum + shader->parameters[i].step))) + if ((shader_info.data->parameters[i].minimum == 0.0) + && (shader_info.data->parameters[i].maximum + == (shader_info.data->parameters[i].minimum + shader_info.data->parameters[i].step))) { if ((pos_y + SHADER_DLG_CHECKBOX_HEIGHT + SHADER_DLG_CTRL_MARGIN + 20) > SHADER_DLG_MAX_HEIGHT) { @@ -227,7 +243,7 @@ void shader_dlg_params_reload(void) } control->type = SHADER_PARAM_CTRL_CHECKBOX; - control->checkbox.hwnd = CreateWindowEx(0, "BUTTON", shader->parameters[i].desc, + control->checkbox.hwnd = CreateWindowEx(0, "BUTTON", shader_info.data->parameters[i].desc, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, pos_x, pos_y, SHADER_DLG_CTRL_WIDTH, SHADER_DLG_CHECKBOX_HEIGHT, g_shader_dlg.hwnd, (HMENU)(size_t)i, NULL, NULL); SendMessage(control->checkbox.hwnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); @@ -243,7 +259,7 @@ void shader_dlg_params_reload(void) } control->type = SHADER_PARAM_CTRL_TRACKBAR; - control->trackbar.label_title = CreateWindowEx(0, "STATIC", shader->parameters[i].desc, + control->trackbar.label_title = CreateWindowEx(0, "STATIC", shader_info.data->parameters[i].desc, WS_CHILD | WS_VISIBLE | SS_LEFT, pos_x, pos_y, SHADER_DLG_CTRL_WIDTH, SHADER_DLG_LABEL_HEIGHT, g_shader_dlg.hwnd, (HMENU)(size_t)i, NULL, NULL); SendMessage(control->trackbar.label_title, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); @@ -318,7 +334,9 @@ static LRESULT CALLBACK ShaderDlgWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { int i, pos; - struct video_shader* shader = video_shader_driver_get_current_shader(); + video_shader_ctx_t shader_info; + + video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info); switch (message) { @@ -347,9 +365,9 @@ static LRESULT CALLBACK ShaderDlgWndProc(HWND hwnd, UINT message, break; if (SendMessage(g_shader_dlg.controls[i].checkbox.hwnd, BM_GETCHECK, 0, 0) == BST_CHECKED) - shader->parameters[i].current = shader->parameters[i].maximum; + shader_info.data->parameters[i].current = shader_info.data->parameters[i].maximum; else - shader->parameters[i].current = shader->parameters[i].minimum; + shader_info.data->parameters[i].current = shader_info.data->parameters[i].minimum; break; @@ -363,7 +381,8 @@ static LRESULT CALLBACK ShaderDlgWndProc(HWND hwnd, UINT message, break; pos = (int)SendMessage(g_shader_dlg.controls[i].trackbar.hwnd, TBM_GETPOS, 0, 0); - shader->parameters[i].current = shader->parameters[i].minimum + pos * shader->parameters[i].step; + shader_info.data->parameters[i].current = + shader_info.data->parameters[i].minimum + pos * shader_info.data->parameters[i].step; shader_dlg_refresh_trackbar_label(i); break;