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.
master
jp9000 2016-06-29 04:15:38 -07:00
parent f60952fe09
commit 4dc0024198
10 changed files with 60 additions and 0 deletions

View File

@ -222,10 +222,18 @@ inline void gs_shader::UpdateParam(vector<uint8_t> &constData,
upload = true;
param.changed = false;
}
} else if (param.curValue.size() == sizeof(gs_texture_t*)) {
gs_texture_t *tex;
memcpy(&tex, param.curValue.data(), sizeof(gs_texture_t*));
device_load_texture(device, tex, param.textureID);
if (param.nextSampler) {
ID3D11SamplerState *state = param.nextSampler->state;
device->context->PSSetSamplers(param.textureID, 1,
&state);
param.nextSampler = nullptr;
}
}
}
@ -384,3 +392,8 @@ void gs_shader_set_default(gs_sparam_t *param)
shader_setval_inline(param, param->defaultValue.data(),
param->defaultValue.size());
}
void gs_shader_set_next_sampler(gs_sparam_t *param, gs_samplerstate_t *sampler)
{
param->nextSampler = sampler;
}

View File

@ -356,6 +356,7 @@ struct gs_shader_param {
gs_shader_param_type type;
uint32_t textureID;
struct gs_sampler_state *nextSampler = nullptr;
int arrayCount;

View File

@ -487,6 +487,12 @@ static void program_set_param_data(struct gs_program *program,
}
} else if (pp->param->type == GS_SHADER_PARAM_TEXTURE) {
if (pp->param->next_sampler) {
program->device->cur_samplers[pp->param->sampler_id] =
pp->param->next_sampler;
pp->param->next_sampler = NULL;
}
glUniform1i(pp->obj, pp->param->texture_id);
device_load_texture(program->device, pp->param->texture,
pp->param->texture_id);
@ -720,3 +726,8 @@ void gs_shader_set_default(gs_sparam_t *param)
{
gs_shader_set_val(param, param->def_value.array, param->def_value.num);
}
void gs_shader_set_next_sampler(gs_sparam_t *param, gs_samplerstate_t *sampler)
{
param->next_sampler = sampler;
}

View File

@ -300,6 +300,7 @@ struct gs_shader_param {
char *name;
gs_shader_t *shader;
gs_samplerstate_t *next_sampler;
GLint texture_id;
size_t sampler_id;
int array_count;

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