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;
}
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;

View File

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

View File

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

View File

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

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)
{
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,

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)
{
#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);

View File

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

View File

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