Add SHADER_CTL_GET_CURRENT_SHADER

This commit is contained in:
twinaphex 2016-02-14 22:13:21 +01:00
parent 38034abce6
commit debb5dd0ce
8 changed files with 86 additions and 53 deletions

View File

@ -58,18 +58,6 @@ const shader_backend_t *shader_ctx_find_driver(const char *ident)
return NULL; 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) const char *video_shader_driver_get_ident(void)
{ {
if (!current_shader) if (!current_shader)
@ -88,6 +76,20 @@ bool video_shader_driver_ctl(enum video_shader_driver_ctl_state state, void *dat
{ {
switch (state) 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: case SHADER_CTL_DIRECT_GET_CURRENT_SHADER:
{ {
video_shader_ctx_t *shader = (video_shader_ctx_t*)data; video_shader_ctx_t *shader = (video_shader_ctx_t*)data;

View File

@ -70,6 +70,7 @@ enum video_shader_driver_ctl_state
SHADER_CTL_FILTER_TYPE, SHADER_CTL_FILTER_TYPE,
SHADER_CTL_USE, SHADER_CTL_USE,
SHADER_CTL_WRAP_TYPE, SHADER_CTL_WRAP_TYPE,
SHADER_CTL_GET_CURRENT_SHADER,
SHADER_CTL_DIRECT_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); 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); const char *video_shader_driver_get_ident(void);
unsigned video_shader_driver_get_prev_textures(void); unsigned video_shader_driver_get_prev_textures(void);

View File

@ -252,20 +252,20 @@ static void menu_action_setting_disp_set_label_shader_parameter(
char *s2, size_t len2) char *s2, size_t len2)
{ {
#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL)
video_shader_ctx_t shader_info;
const struct video_shader_parameter *param = NULL; const struct video_shader_parameter *param = NULL;
struct video_shader *shader = NULL;
#endif #endif
*s = '\0'; *s = '\0';
*w = 19; *w = 19;
strlcpy(s2, path, len2); strlcpy(s2, path, len2);
#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) #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; return;
param = &shader->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; param = &shader_info.data->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0];
if (!param) if (!param)
return; return;

View File

@ -52,9 +52,13 @@ static int generic_shader_action_parameter_left(
static int shader_action_parameter_left(unsigned type, const char *label, static int shader_action_parameter_left(unsigned type, const char *label,
bool wraparound) bool wraparound)
{ {
struct video_shader *shader = video_shader_driver_get_current_shader(); video_shader_ctx_t shader_info;
struct video_shader_parameter *param = &shader->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; struct video_shader_parameter *param = NULL;
return generic_shader_action_parameter_left(shader, param, type, label, wraparound);
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, static int shader_action_parameter_preset_left(unsigned type, const char *label,

View File

@ -56,9 +56,13 @@ static int generic_shader_action_parameter_right(
int shader_action_parameter_right(unsigned type, const char *label, bool wraparound) int shader_action_parameter_right(unsigned type, const char *label, bool wraparound)
{ {
struct video_shader *shader = video_shader_driver_get_current_shader(); video_shader_ctx_t shader_info;
struct video_shader_parameter *param = &shader->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; struct video_shader_parameter *param = NULL;
return generic_shader_action_parameter_right(shader, param, type, label, wraparound);
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, int shader_action_parameter_preset_right(unsigned type, const char *label,

View File

@ -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) static int action_start_shader_action_parameter(unsigned type, const char *label)
{ {
#ifdef HAVE_SHADER_MANAGER #ifdef HAVE_SHADER_MANAGER
video_shader_ctx_t shader_info;
struct video_shader_parameter *param = NULL; 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; 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 = param->initial;
param->current = min(max(param->minimum, param->current), param->maximum); param->current = min(max(param->minimum, param->current), param->maximum);

View File

@ -2569,10 +2569,10 @@ int menu_displaylist_push_list(menu_displaylist_info_t *info, unsigned type)
{ {
size_t i; size_t i;
menu_ctx_displaylist_t disp_list; menu_ctx_displaylist_t disp_list;
int ret = 0;
#ifdef HAVE_SHADER_MANAGER #ifdef HAVE_SHADER_MANAGER
struct video_shader *shader = NULL; video_shader_ctx_t shader_info;
#endif #endif
int ret = 0;
rarch_system_info_t *system = NULL; rarch_system_info_t *system = NULL;
core_info_list_t *list = NULL; core_info_list_t *list = NULL;
menu_handle_t *menu = 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:
case DISPLAYLIST_SHADER_PARAMETERS_PRESET: case DISPLAYLIST_SHADER_PARAMETERS_PRESET:
#ifdef HAVE_SHADER_MANAGER #ifdef HAVE_SHADER_MANAGER
shader = video_shader_driver_get_current_shader(); video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info);
if (shader)
ret = deferred_push_video_shader_parameters_common(info, shader, if (shader_info.data)
ret = deferred_push_video_shader_parameters_common(info, shader_info.data,
(type == DISPLAYLIST_SHADER_PARAMETERS) (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 else
{ {

View File

@ -118,13 +118,18 @@ static shader_dlg_t g_shader_dlg = {0};
static void shader_dlg_refresh_trackbar_label(int index) static void shader_dlg_refresh_trackbar_label(int index)
{ {
video_shader_ctx_t shader_info;
char val_buffer[32] = {0}; 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) video_shader_driver_ctl(SHADER_CTL_GET_CURRENT_SHADER, &shader_info);
snprintf(val_buffer, sizeof(val_buffer), "%.0f", shader->parameters[index].current);
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 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); 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) static void shader_dlg_params_refresh(void)
{ {
int i; 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++) for (i = 0; i < GFX_MAX_PARAMETERS; i++)
{ {
@ -146,7 +153,9 @@ static void shader_dlg_params_refresh(void)
{ {
case SHADER_PARAM_CTRL_CHECKBOX: 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); SendMessage(control->checkbox.hwnd, BM_SETCHECK, checked, 0);
} }
break; 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_SETRANGEMIN, (WPARAM)TRUE, (LPARAM)0);
SendMessage(control->trackbar.hwnd, TBM_SETRANGEMAX, (WPARAM)TRUE, 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, 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; break;
case SHADER_PARAM_CTRL_NONE: case SHADER_PARAM_CTRL_NONE:
default: default:
@ -200,25 +213,28 @@ void shader_dlg_params_reload(void)
HFONT hFont; HFONT hFont;
RECT parent_rect; RECT parent_rect;
int i, pos_x, pos_y; 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(); shader_dlg_params_clear();
if (!shader) if (!shader_info.data)
return; return;
if (shader->num_parameters > GFX_MAX_PARAMETERS) if (shader_info.data->num_parameters > GFX_MAX_PARAMETERS)
return; return;
hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
pos_y = g_shader_dlg.parameters_start_y; pos_y = g_shader_dlg.parameters_start_y;
pos_x = SHADER_DLG_CTRL_X; 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]; shader_param_ctrl_t*control = &g_shader_dlg.controls[i];
if ((shader->parameters[i].minimum == 0.0) if ((shader_info.data->parameters[i].minimum == 0.0)
&& (shader->parameters[i].maximum == (shader->parameters[i].minimum + shader->parameters[i].step))) && (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) 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->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, 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); g_shader_dlg.hwnd, (HMENU)(size_t)i, NULL, NULL);
SendMessage(control->checkbox.hwnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); 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->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, 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); (HMENU)(size_t)i, NULL, NULL);
SendMessage(control->trackbar.label_title, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); 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) WPARAM wparam, LPARAM lparam)
{ {
int i, pos; 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) switch (message)
{ {
@ -347,9 +365,9 @@ static LRESULT CALLBACK ShaderDlgWndProc(HWND hwnd, UINT message,
break; break;
if (SendMessage(g_shader_dlg.controls[i].checkbox.hwnd, BM_GETCHECK, 0, 0) == BST_CHECKED) 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 else
shader->parameters[i].current = shader->parameters[i].minimum; shader_info.data->parameters[i].current = shader_info.data->parameters[i].minimum;
break; break;
@ -363,7 +381,8 @@ static LRESULT CALLBACK ShaderDlgWndProc(HWND hwnd, UINT message,
break; break;
pos = (int)SendMessage(g_shader_dlg.controls[i].trackbar.hwnd, TBM_GETPOS, 0, 0); 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); shader_dlg_refresh_trackbar_label(i);
break; break;