Add support for glsl450 min/max/clamp

This commit is contained in:
baldurk
2020-04-14 17:09:47 +01:00
parent 7d0bbbda93
commit 91e7563d09
2 changed files with 223 additions and 0 deletions
@@ -78,6 +78,138 @@ ShaderVariable Pow(ThreadState &state, const rdcarray<Id> &params)
return var;
}
template <typename T>
static T GLSLMax(T x, T y)
{
return x < y ? y : x;
}
template <typename T>
static T GLSLMin(T x, T y)
{
return y < x ? y : x;
}
ShaderVariable FMax(ThreadState &state, const rdcarray<Id> &params)
{
CHECK_PARAMS(2);
ShaderVariable var = state.GetSrc(params[0]);
ShaderVariable y = state.GetSrc(params[1]);
for(uint32_t c = 0; c < var.columns; c++)
var.value.fv[c] = GLSLMax(var.value.fv[c], y.value.fv[c]);
return var;
}
ShaderVariable UMax(ThreadState &state, const rdcarray<Id> &params)
{
CHECK_PARAMS(2);
ShaderVariable var = state.GetSrc(params[0]);
ShaderVariable y = state.GetSrc(params[1]);
for(uint32_t c = 0; c < var.columns; c++)
var.value.uv[c] = GLSLMax(var.value.uv[c], y.value.uv[c]);
return var;
}
ShaderVariable SMax(ThreadState &state, const rdcarray<Id> &params)
{
CHECK_PARAMS(2);
ShaderVariable var = state.GetSrc(params[0]);
ShaderVariable y = state.GetSrc(params[1]);
for(uint32_t c = 0; c < var.columns; c++)
var.value.iv[c] = GLSLMax(var.value.iv[c], y.value.iv[c]);
return var;
}
ShaderVariable FMin(ThreadState &state, const rdcarray<Id> &params)
{
CHECK_PARAMS(2);
ShaderVariable var = state.GetSrc(params[0]);
ShaderVariable y = state.GetSrc(params[1]);
for(uint32_t c = 0; c < var.columns; c++)
var.value.fv[c] = GLSLMin(var.value.fv[c], y.value.fv[c]);
return var;
}
ShaderVariable UMin(ThreadState &state, const rdcarray<Id> &params)
{
CHECK_PARAMS(2);
ShaderVariable var = state.GetSrc(params[0]);
ShaderVariable y = state.GetSrc(params[1]);
for(uint32_t c = 0; c < var.columns; c++)
var.value.uv[c] = GLSLMin(var.value.uv[c], y.value.uv[c]);
return var;
}
ShaderVariable SMin(ThreadState &state, const rdcarray<Id> &params)
{
CHECK_PARAMS(2);
ShaderVariable var = state.GetSrc(params[0]);
ShaderVariable y = state.GetSrc(params[1]);
for(uint32_t c = 0; c < var.columns; c++)
var.value.iv[c] = GLSLMin(var.value.iv[c], y.value.iv[c]);
return var;
}
ShaderVariable FClamp(ThreadState &state, const rdcarray<Id> &params)
{
CHECK_PARAMS(3);
ShaderVariable var = state.GetSrc(params[0]);
ShaderVariable minVal = state.GetSrc(params[1]);
ShaderVariable maxVal = state.GetSrc(params[2]);
for(uint32_t c = 0; c < var.columns; c++)
var.value.fv[c] = GLSLMin(GLSLMax(var.value.fv[c], minVal.value.fv[c]), maxVal.value.fv[c]);
return var;
}
ShaderVariable UClamp(ThreadState &state, const rdcarray<Id> &params)
{
CHECK_PARAMS(3);
ShaderVariable var = state.GetSrc(params[0]);
ShaderVariable minVal = state.GetSrc(params[1]);
ShaderVariable maxVal = state.GetSrc(params[2]);
for(uint32_t c = 0; c < var.columns; c++)
var.value.uv[c] = GLSLMin(GLSLMax(var.value.uv[c], minVal.value.uv[c]), maxVal.value.uv[c]);
return var;
}
ShaderVariable SClamp(ThreadState &state, const rdcarray<Id> &params)
{
CHECK_PARAMS(3);
ShaderVariable var = state.GetSrc(params[0]);
ShaderVariable minVal = state.GetSrc(params[1]);
ShaderVariable maxVal = state.GetSrc(params[2]);
for(uint32_t c = 0; c < var.columns; c++)
var.value.iv[c] = GLSLMin(GLSLMax(var.value.iv[c], minVal.value.iv[c]), maxVal.value.iv[c]);
return var;
}
ShaderVariable FMix(ThreadState &state, const rdcarray<Id> &params)
{
CHECK_PARAMS(3);
@@ -148,6 +280,15 @@ void ConfigureGLSLStd450(ExtInstDispatcher &extinst)
EXT(FAbs);
EXT(Floor);
EXT(Pow);
EXT(FMin);
EXT(UMin);
EXT(SMin);
EXT(FMax);
EXT(UMax);
EXT(SMax);
EXT(FClamp);
EXT(UClamp);
EXT(SClamp);
EXT(FMix);
EXT(Cross);
EXT(Normalize);
@@ -359,6 +359,88 @@ void main()
Color = texture(linearSampledImage, inpos);
break;
}
case 35:
{
Color = vec4(max(posone*3.3f, posone*4.4f),
max(posone*4.4f, posone*3.3f),
max(posone, posinf),
max(posone, neginf));
break;
}
case 36:
{
Color = vec4(max(negone*3.3f, negone*4.4f),
max(negone*4.4f, negone*3.3f),
max(negone, posinf),
max(negone, neginf));
break;
}
case 37:
{
Color = vec4(min(posone*3.3f, posone*4.4f),
min(posone*4.4f, posone*3.3f),
min(posone, posinf),
min(posone, neginf));
break;
}
case 38:
{
Color = vec4(min(negone*3.3f, negone*4.4f),
min(negone*4.4f, negone*3.3f),
min(negone, posinf),
min(negone, neginf));
break;
}
case 39:
{
Color = vec4(float(max(zeroi+5, zeroi+8)),
float(max(zeroi+8, zeroi+5)),
float(max(zeroi-8, zeroi-5)),
float(max(zeroi-5, zeroi-8)));
break;
}
case 40:
{
Color = vec4(float(min(zeroi+5, zeroi+8)),
float(min(zeroi+8, zeroi+5)),
float(min(zeroi-8, zeroi-5)),
float(min(zeroi-5, zeroi-8)));
break;
}
case 41:
{
Color = vec4(float(max(zerou+5, zerou+8)),
float(max(zerou+8, zerou+5)),
float(min(zerou+8, zerou+5)),
float(min(zerou+5, zerou+8)));
break;
}
case 42:
{
Color = vec4(clamp(posone*3.3f, posone, posone*5.0f),
clamp(posone*0.3f, posone, posone*5.0f),
clamp(posone*8.3f, posone, posone*5.0f),
1.0f);
break;
}
case 43:
{
uint x = uint(posone);
Color = vec4(float(clamp(x*4, zerou+2, zerou+50)),
float(clamp(x, zerou+2, zerou+50)),
float(clamp(x*400, zerou+2, zerou+50)),
1.0f);
break;
}
case 44:
{
int x = int(posone);
Color = vec4(float(clamp(x*4, zeroi+2, zeroi+50)),
float(clamp(x, zeroi+2, zeroi+50)),
float(clamp(x*400, zeroi+2, zeroi+50)),
1.0f);
break;
}
default: break;
}
}