libobs/graphics: Add ability to set shader texture sampler

(Note: This also modifies libobs-d3d11 and libobs-opengl)

Allows overriding the sampler for a specific shader parameter.
This commit is contained in:
jp9000
2016-06-29 04:15:38 -07:00
parent f60952fe09
commit 4dc0024198
10 changed files with 60 additions and 0 deletions

View File

@@ -125,6 +125,8 @@ void gs_technique_end(gs_technique_t *tech)
da_free(param->cur_val);
param->changed = false;
if (param->next_sampler)
param->next_sampler = NULL;
}
}
@@ -147,6 +149,9 @@ static void upload_shader_params(struct darray *pass_params, bool changed_only)
struct gs_effect_param *eparam = param->eparam;
gs_sparam_t *sparam = param->sparam;
if (eparam->next_sampler)
gs_shader_set_next_sampler(sparam, eparam->next_sampler);
if (changed_only && !eparam->changed)
continue;
@@ -378,3 +383,14 @@ void gs_effect_set_default(gs_eparam_t *param)
effect_setval_inline(param, param->default_val.array,
param->default_val.num);
}
void gs_effect_set_next_sampler(gs_eparam_t *param, gs_samplerstate_t *sampler)
{
if (!param) {
blog(LOG_ERROR, "gs_effect_set_next_sampler: invalid param");
return;
}
if (param->type == GS_SHADER_PARAM_TEXTURE)
param->next_sampler = sampler;
}

View File

@@ -57,6 +57,7 @@ struct gs_effect_param {
DARRAY(uint8_t) default_val;
gs_effect_t *effect;
gs_samplerstate_t *next_sampler;
/*char *full_name;
float scroller_min, scroller_max, scroller_inc, scroller_mul;*/

View File

@@ -167,6 +167,7 @@ bool load_graphics_imports(struct gs_exports *exports, void *module,
GRAPHICS_IMPORT(gs_shader_set_texture);
GRAPHICS_IMPORT(gs_shader_set_val);
GRAPHICS_IMPORT(gs_shader_set_default);
GRAPHICS_IMPORT(gs_shader_set_next_sampler);
/* OSX/Cocoa specific functions */
#ifdef __APPLE__

View File

@@ -225,6 +225,8 @@ struct gs_exports {
void (*gs_shader_set_val)(gs_sparam_t *param, const void *val,
size_t size);
void (*gs_shader_set_default)(gs_sparam_t *param);
void (*gs_shader_set_next_sampler)(gs_sparam_t *param,
gs_samplerstate_t *sampler);
#ifdef __APPLE__
/* OSX/Cocoa specific functions */

View File

@@ -2089,6 +2089,16 @@ void gs_shader_set_default(gs_sparam_t *param)
graphics->exports.gs_shader_set_default(param);
}
void gs_shader_set_next_sampler(gs_sparam_t *param, gs_samplerstate_t *sampler)
{
graphics_t *graphics = thread_graphics;
if (!gs_valid_p("gs_shader_set_next_sampler", param))
return;
graphics->exports.gs_shader_set_next_sampler(param, sampler);
}
void gs_texture_destroy(gs_texture_t *tex)
{
graphics_t *graphics = thread_graphics;

View File

@@ -325,6 +325,8 @@ EXPORT void gs_shader_set_vec4(gs_sparam_t *param, const struct vec4 *val);
EXPORT void gs_shader_set_texture(gs_sparam_t *param, gs_texture_t *val);
EXPORT void gs_shader_set_val(gs_sparam_t *param, const void *val, size_t size);
EXPORT void gs_shader_set_default(gs_sparam_t *param);
EXPORT void gs_shader_set_next_sampler(gs_sparam_t *param,
gs_samplerstate_t *sampler);
/* ---------------------------------------------------
* effect functions
@@ -393,6 +395,8 @@ EXPORT void gs_effect_set_vec4(gs_eparam_t *param, const struct vec4 *val);
EXPORT void gs_effect_set_texture(gs_eparam_t *param, gs_texture_t *val);
EXPORT void gs_effect_set_val(gs_eparam_t *param, const void *val, size_t size);
EXPORT void gs_effect_set_default(gs_eparam_t *param);
EXPORT void gs_effect_set_next_sampler(gs_eparam_t *param,
gs_samplerstate_t *sampler);
/* ---------------------------------------------------
* texture render helper functions