Shader variable emit fixes

This commit is contained in:
Jack Andersen 2016-07-07 14:05:45 -10:00
parent c47ae9f3b6
commit c544d99f98
4 changed files with 78 additions and 31 deletions

2
hecl/extern/boo vendored

@ -1 +1 @@
Subproject commit 5c91ba8da7951b2b039da5fb07cf5dcd49be2790 Subproject commit 44e8317d49cd5be5776a48ebc9715495cb47552a

View File

@ -56,13 +56,18 @@ private:
unsigned addTexCoordGen(TexGenSrc src, int uvIdx, int mtx); unsigned addTexCoordGen(TexGenSrc src, int uvIdx, int mtx);
unsigned addTexSampling(unsigned mapIdx, unsigned tcgIdx); unsigned addTexSampling(unsigned mapIdx, unsigned tcgIdx);
std::string RecursiveTraceColor(const IR& ir, Diagnostics& diag, std::string RecursiveTraceColor(const IR& ir, Diagnostics& diag,
const IR::Instruction& inst); const IR::Instruction& inst, bool toSwizzle);
std::string RecursiveTraceAlpha(const IR& ir, Diagnostics& diag, std::string RecursiveTraceAlpha(const IR& ir, Diagnostics& diag,
const IR::Instruction& inst); const IR::Instruction& inst, bool toSwizzle);
unsigned RecursiveTraceTexGen(const IR& ir, Diagnostics& diag, unsigned RecursiveTraceTexGen(const IR& ir, Diagnostics& diag,
const IR::Instruction& inst, const IR::Instruction& inst,
int mtx); int mtx);
std::string EmitSamplingUseRaw(unsigned samplingIdx) const
{
return hecl::Format("sampling%u", samplingIdx);
}
std::string EmitSamplingUseRGB(unsigned samplingIdx) const std::string EmitSamplingUseRGB(unsigned samplingIdx) const
{ {
return hecl::Format("sampling%u.rgb", samplingIdx); return hecl::Format("sampling%u.rgb", samplingIdx);
@ -78,6 +83,11 @@ private:
return hecl::Format("colorReg%u", idx); return hecl::Format("colorReg%u", idx);
} }
std::string EmitLightingRaw() const
{
return std::string("lighting");
}
std::string EmitLightingRGB() const std::string EmitLightingRGB() const
{ {
return std::string("lighting.rgb"); return std::string("lighting.rgb");

View File

@ -17,9 +17,9 @@ std::string GLSL::EmitTexGenSource2(TexGenSrc src, int uvIdx) const
switch (src) switch (src)
{ {
case TexGenSrc::Position: case TexGenSrc::Position:
return "posIn.xy\n"; return "posIn.xy";
case TexGenSrc::Normal: case TexGenSrc::Normal:
return "normIn.xy\n"; return "normIn.xy";
case TexGenSrc::UV: case TexGenSrc::UV:
return hecl::Format("uvIn[%u]", uvIdx); return hecl::Format("uvIn[%u]", uvIdx);
default: break; default: break;
@ -32,9 +32,9 @@ std::string GLSL::EmitTexGenSource4(TexGenSrc src, int uvIdx) const
switch (src) switch (src)
{ {
case TexGenSrc::Position: case TexGenSrc::Position:
return "vec4(posIn, 1.0)\n"; return "vec4(posIn, 1.0)";
case TexGenSrc::Normal: case TexGenSrc::Normal:
return "vec4(normIn, 1.0)\n"; return "vec4(normIn, 1.0)";
case TexGenSrc::UV: case TexGenSrc::UV:
return hecl::Format("vec4(uvIn[%u], 0.0, 1.0)", uvIdx); return hecl::Format("vec4(uvIn[%u], 0.0, 1.0)", uvIdx);
default: break; default: break;
@ -166,8 +166,8 @@ std::string GLSL::makeFrag(const char* glslVer,
lightingSrc = lighting.m_source; lightingSrc = lighting.m_source;
std::string texMapDecl; std::string texMapDecl;
if (m_texMapEnd) for (int i=0 ; i<m_texMapEnd ; ++i)
texMapDecl = hecl::Format("TBINDING0 uniform sampler2D texs[%u];\n", m_texMapEnd); texMapDecl += hecl::Format("TBINDING%u uniform sampler2D tex%u;\n", i, i);
std::string retval = std::string(glslVer) + "\n" BOO_GLSL_BINDING_HEAD + std::string retval = std::string(glslVer) + "\n" BOO_GLSL_BINDING_HEAD +
GenerateVertToFragStruct() + GenerateVertToFragStruct() +
@ -188,7 +188,7 @@ std::string GLSL::makeFrag(const char* glslVer,
unsigned sampIdx = 0; unsigned sampIdx = 0;
for (const TexSampling& sampling : m_texSamplings) for (const TexSampling& sampling : m_texSamplings)
retval += hecl::Format(" vec4 sampling%u = texture(texs[%u], vtf.tcgs[%u]);\n", retval += hecl::Format(" vec4 sampling%u = texture(tex%u, vtf.tcgs[%u]);\n",
sampIdx++, sampling.mapIdx, sampling.tcgIdx); sampIdx++, sampling.mapIdx, sampling.tcgIdx);
if (m_alphaExpr.size()) if (m_alphaExpr.size())
@ -216,8 +216,8 @@ std::string GLSL::makeFrag(const char* glslVer,
postEntry = post.m_entry; postEntry = post.m_entry;
std::string texMapDecl; std::string texMapDecl;
if (m_texMapEnd) for (int i=0 ; i<m_texMapEnd ; ++i)
texMapDecl = hecl::Format("TBINDING0 uniform sampler2D texs[%u];\n", m_texMapEnd); texMapDecl += hecl::Format("TBINDING%u uniform sampler2D tex%u;\n", i, i);
std::string retval = std::string(glslVer) + "\n" BOO_GLSL_BINDING_HEAD + std::string retval = std::string(glslVer) + "\n" BOO_GLSL_BINDING_HEAD +
GenerateVertToFragStruct() + GenerateVertToFragStruct() +
@ -238,7 +238,7 @@ std::string GLSL::makeFrag(const char* glslVer,
unsigned sampIdx = 0; unsigned sampIdx = 0;
for (const TexSampling& sampling : m_texSamplings) for (const TexSampling& sampling : m_texSamplings)
retval += hecl::Format(" vec4 sampling%u = texture(texs[%u], vtf.tcgs[%u]);\n", retval += hecl::Format(" vec4 sampling%u = texture(tex%u, vtf.tcgs[%u]);\n",
sampIdx++, sampling.mapIdx, sampling.tcgIdx); sampIdx++, sampling.mapIdx, sampling.tcgIdx);
if (m_alphaExpr.size()) if (m_alphaExpr.size())
@ -256,6 +256,18 @@ namespace Runtime
static const char* STD_BLOCKNAMES[] = {HECL_GLSL_VERT_UNIFORM_BLOCK_NAME, static const char* STD_BLOCKNAMES[] = {HECL_GLSL_VERT_UNIFORM_BLOCK_NAME,
HECL_GLSL_TEXMTX_UNIFORM_BLOCK_NAME}; HECL_GLSL_TEXMTX_UNIFORM_BLOCK_NAME};
static const char* STD_TEXNAMES[] =
{
"tex0",
"tex1",
"tex2",
"tex3",
"tex4",
"tex5",
"tex6",
"tex7"
};
struct GLSLBackendFactory : IShaderBackendFactory struct GLSLBackendFactory : IShaderBackendFactory
{ {
Backend::GLSL m_backend; Backend::GLSL m_backend;
@ -277,10 +289,14 @@ struct GLSLBackendFactory : IShaderBackendFactory
std::string fragSource = m_backend.makeFrag("#version 330"); std::string fragSource = m_backend.makeFrag("#version 330");
cachedSz += fragSource.size() + 1; cachedSz += fragSource.size() + 1;
if (m_backend.m_texMapEnd > 8)
Log.report(logvisor::Fatal, "maximum of 8 texture maps supported");
objOut = objOut =
static_cast<boo::GLDataFactory::Context&>(ctx). static_cast<boo::GLDataFactory::Context&>(ctx).
newShaderPipeline(vertSource.c_str(), fragSource.c_str(), newShaderPipeline(vertSource.c_str(), fragSource.c_str(),
m_backend.m_texMapEnd, "texs", m_backend.m_texMapEnd, STD_TEXNAMES,
2, STD_BLOCKNAMES, 2, STD_BLOCKNAMES,
m_backend.m_blendSrc, m_backend.m_blendDst, tag.getPrimType(), m_backend.m_blendSrc, m_backend.m_blendDst, tag.getPrimType(),
tag.getDepthTest(), tag.getDepthWrite(), tag.getDepthTest(), tag.getDepthWrite(),
@ -309,10 +325,14 @@ struct GLSLBackendFactory : IShaderBackendFactory
boo::BlendFactor blendDst = boo::BlendFactor(r.readUByte()); boo::BlendFactor blendDst = boo::BlendFactor(r.readUByte());
std::string vertSource = r.readString(); std::string vertSource = r.readString();
std::string fragSource = r.readString(); std::string fragSource = r.readString();
if (texMapEnd > 8)
Log.report(logvisor::Fatal, "maximum of 8 texture maps supported");
boo::IShaderPipeline* ret = boo::IShaderPipeline* ret =
static_cast<boo::GLDataFactory::Context&>(ctx). static_cast<boo::GLDataFactory::Context&>(ctx).
newShaderPipeline(vertSource.c_str(), fragSource.c_str(), newShaderPipeline(vertSource.c_str(), fragSource.c_str(),
texMapEnd, "texs", texMapEnd, STD_TEXNAMES,
2, STD_BLOCKNAMES, 2, STD_BLOCKNAMES,
blendSrc, blendDst, tag.getPrimType(), blendSrc, blendDst, tag.getPrimType(),
tag.getDepthTest(), tag.getDepthWrite(), tag.getDepthTest(), tag.getDepthWrite(),
@ -338,6 +358,9 @@ struct GLSLBackendFactory : IShaderBackendFactory
tag.getSkinSlotCount(), tag.getTexMtxCount()); tag.getSkinSlotCount(), tag.getTexMtxCount());
cachedSz += vertSource.size() + 1; cachedSz += vertSource.size() + 1;
if (m_backend.m_texMapEnd > 8)
Log.report(logvisor::Fatal, "maximum of 8 texture maps supported");
std::vector<std::string> fragSources; std::vector<std::string> fragSources;
fragSources.reserve(extensionSlots.size()); fragSources.reserve(extensionSlots.size());
for (const ShaderCacheExtensions::ExtensionSlot& slot : extensionSlots) for (const ShaderCacheExtensions::ExtensionSlot& slot : extensionSlots)
@ -355,7 +378,7 @@ struct GLSLBackendFactory : IShaderBackendFactory
boo::IShaderPipeline* ret = boo::IShaderPipeline* ret =
static_cast<boo::GLDataFactory::Context&>(ctx). static_cast<boo::GLDataFactory::Context&>(ctx).
newShaderPipeline(vertSource.c_str(), fragSources.back().c_str(), newShaderPipeline(vertSource.c_str(), fragSources.back().c_str(),
m_backend.m_texMapEnd, "texs", bc, bn, m_backend.m_texMapEnd, STD_TEXNAMES, bc, bn,
m_backend.m_blendSrc, m_backend.m_blendDst, tag.getPrimType(), m_backend.m_blendSrc, m_backend.m_blendDst, tag.getPrimType(),
tag.getDepthTest(), tag.getDepthWrite(), tag.getDepthTest(), tag.getDepthWrite(),
tag.getBackfaceCulling()); tag.getBackfaceCulling());
@ -387,6 +410,10 @@ struct GLSLBackendFactory : IShaderBackendFactory
boo::BlendFactor blendSrc = boo::BlendFactor(r.readUByte()); boo::BlendFactor blendSrc = boo::BlendFactor(r.readUByte());
boo::BlendFactor blendDst = boo::BlendFactor(r.readUByte()); boo::BlendFactor blendDst = boo::BlendFactor(r.readUByte());
std::string vertSource = r.readString(); std::string vertSource = r.readString();
if (texMapEnd > 8)
Log.report(logvisor::Fatal, "maximum of 8 texture maps supported");
for (const ShaderCacheExtensions::ExtensionSlot& slot : extensionSlots) for (const ShaderCacheExtensions::ExtensionSlot& slot : extensionSlots)
{ {
size_t bc = 2; size_t bc = 2;
@ -401,7 +428,7 @@ struct GLSLBackendFactory : IShaderBackendFactory
boo::IShaderPipeline* ret = boo::IShaderPipeline* ret =
static_cast<boo::GLDataFactory::Context&>(ctx). static_cast<boo::GLDataFactory::Context&>(ctx).
newShaderPipeline(vertSource.c_str(), fragSource.c_str(), newShaderPipeline(vertSource.c_str(), fragSource.c_str(),
texMapEnd, "texs", bc, bn, texMapEnd, STD_TEXNAMES, bc, bn,
blendSrc, blendDst, tag.getPrimType(), blendSrc, blendDst, tag.getPrimType(),
tag.getDepthTest(), tag.getDepthWrite(), tag.getDepthTest(), tag.getDepthWrite(),
tag.getBackfaceCulling()); tag.getBackfaceCulling());

View File

@ -75,7 +75,7 @@ unsigned ProgrammableCommon::RecursiveTraceTexGen(const IR& ir, Diagnostics& dia
} }
std::string ProgrammableCommon::RecursiveTraceColor(const IR& ir, Diagnostics& diag, std::string ProgrammableCommon::RecursiveTraceColor(const IR& ir, Diagnostics& diag,
const IR::Instruction& inst) const IR::Instruction& inst, bool toSwizzle)
{ {
switch (inst.m_op) switch (inst.m_op)
{ {
@ -94,7 +94,8 @@ std::string ProgrammableCommon::RecursiveTraceColor(const IR& ir, Diagnostics& d
const IR::Instruction& tcgInst = inst.getChildInst(ir, 1); const IR::Instruction& tcgInst = inst.getChildInst(ir, 1);
unsigned texGenIdx = RecursiveTraceTexGen(ir, diag, tcgInst, -1); unsigned texGenIdx = RecursiveTraceTexGen(ir, diag, tcgInst, -1);
return EmitSamplingUseRGB(addTexSampling(mapIdx, texGenIdx)); return toSwizzle ? EmitSamplingUseRaw(addTexSampling(mapIdx, texGenIdx)) :
EmitSamplingUseRGB(addTexSampling(mapIdx, texGenIdx));
} }
else if (!name.compare("ColorReg")) else if (!name.compare("ColorReg"))
{ {
@ -105,7 +106,7 @@ std::string ProgrammableCommon::RecursiveTraceColor(const IR& ir, Diagnostics& d
else if (!name.compare("Lighting")) else if (!name.compare("Lighting"))
{ {
m_lighting = true; m_lighting = true;
return EmitLightingRGB(); return toSwizzle ? EmitLightingRaw() : EmitLightingRGB();
} }
else else
diag.reportBackendErr(inst.m_loc, "unable to interpret '%s'", name.c_str()); diag.reportBackendErr(inst.m_loc, "unable to interpret '%s'", name.c_str());
@ -121,8 +122,8 @@ std::string ProgrammableCommon::RecursiveTraceColor(const IR& ir, Diagnostics& d
ArithmeticOp op = inst.m_arithmetic.m_op; ArithmeticOp op = inst.m_arithmetic.m_op;
const IR::Instruction& aInst = inst.getChildInst(ir, 0); const IR::Instruction& aInst = inst.getChildInst(ir, 0);
const IR::Instruction& bInst = inst.getChildInst(ir, 1); const IR::Instruction& bInst = inst.getChildInst(ir, 1);
std::string aTrace = RecursiveTraceColor(ir, diag, aInst); std::string aTrace = RecursiveTraceColor(ir, diag, aInst, false);
std::string bTrace = RecursiveTraceColor(ir, diag, bInst); std::string bTrace = RecursiveTraceColor(ir, diag, bInst, false);
switch (op) switch (op)
{ {
@ -149,7 +150,7 @@ std::string ProgrammableCommon::RecursiveTraceColor(const IR& ir, Diagnostics& d
case IR::OpType::Swizzle: case IR::OpType::Swizzle:
{ {
const IR::Instruction& aInst = inst.getChildInst(ir, 0); const IR::Instruction& aInst = inst.getChildInst(ir, 0);
std::string aTrace = RecursiveTraceColor(ir, diag, aInst); std::string aTrace = RecursiveTraceColor(ir, diag, aInst, true);
return EmitSwizzle3(diag, inst.m_loc, aTrace, inst.m_swizzle.m_idxs); return EmitSwizzle3(diag, inst.m_loc, aTrace, inst.m_swizzle.m_idxs);
} }
default: default:
@ -160,7 +161,7 @@ std::string ProgrammableCommon::RecursiveTraceColor(const IR& ir, Diagnostics& d
} }
std::string ProgrammableCommon::RecursiveTraceAlpha(const IR& ir, Diagnostics& diag, std::string ProgrammableCommon::RecursiveTraceAlpha(const IR& ir, Diagnostics& diag,
const IR::Instruction& inst) const IR::Instruction& inst, bool toSwizzle)
{ {
switch (inst.m_op) switch (inst.m_op)
{ {
@ -179,7 +180,8 @@ std::string ProgrammableCommon::RecursiveTraceAlpha(const IR& ir, Diagnostics& d
const IR::Instruction& tcgInst = inst.getChildInst(ir, 1); const IR::Instruction& tcgInst = inst.getChildInst(ir, 1);
unsigned texGenIdx = RecursiveTraceTexGen(ir, diag, tcgInst, -1); unsigned texGenIdx = RecursiveTraceTexGen(ir, diag, tcgInst, -1);
return EmitSamplingUseAlpha(addTexSampling(mapIdx, texGenIdx)); return toSwizzle ? EmitSamplingUseRaw(addTexSampling(mapIdx, texGenIdx)) :
EmitSamplingUseAlpha(addTexSampling(mapIdx, texGenIdx));
} }
else if (!name.compare("ColorReg")) else if (!name.compare("ColorReg"))
{ {
@ -190,7 +192,7 @@ std::string ProgrammableCommon::RecursiveTraceAlpha(const IR& ir, Diagnostics& d
else if (!name.compare("Lighting")) else if (!name.compare("Lighting"))
{ {
m_lighting = true; m_lighting = true;
return EmitLightingAlpha(); return toSwizzle ? EmitLightingRaw() : EmitLightingAlpha();
} }
else else
diag.reportBackendErr(inst.m_loc, "unable to interpret '%s'", name.c_str()); diag.reportBackendErr(inst.m_loc, "unable to interpret '%s'", name.c_str());
@ -206,8 +208,8 @@ std::string ProgrammableCommon::RecursiveTraceAlpha(const IR& ir, Diagnostics& d
ArithmeticOp op = inst.m_arithmetic.m_op; ArithmeticOp op = inst.m_arithmetic.m_op;
const IR::Instruction& aInst = inst.getChildInst(ir, 0); const IR::Instruction& aInst = inst.getChildInst(ir, 0);
const IR::Instruction& bInst = inst.getChildInst(ir, 1); const IR::Instruction& bInst = inst.getChildInst(ir, 1);
std::string aTrace = RecursiveTraceAlpha(ir, diag, aInst); std::string aTrace = RecursiveTraceAlpha(ir, diag, aInst, false);
std::string bTrace = RecursiveTraceAlpha(ir, diag, bInst); std::string bTrace = RecursiveTraceAlpha(ir, diag, bInst, false);
switch (op) switch (op)
{ {
@ -234,7 +236,7 @@ std::string ProgrammableCommon::RecursiveTraceAlpha(const IR& ir, Diagnostics& d
case IR::OpType::Swizzle: case IR::OpType::Swizzle:
{ {
const IR::Instruction& aInst = inst.getChildInst(ir, 0); const IR::Instruction& aInst = inst.getChildInst(ir, 0);
std::string aTrace = RecursiveTraceAlpha(ir, diag, aInst); std::string aTrace = RecursiveTraceAlpha(ir, diag, aInst, true);
return EmitSwizzle1(diag, inst.m_loc, aTrace, inst.m_swizzle.m_idxs); return EmitSwizzle1(diag, inst.m_loc, aTrace, inst.m_swizzle.m_idxs);
} }
default: default:
@ -246,6 +248,14 @@ std::string ProgrammableCommon::RecursiveTraceAlpha(const IR& ir, Diagnostics& d
void ProgrammableCommon::reset(const IR& ir, Diagnostics& diag, const char* backendName) void ProgrammableCommon::reset(const IR& ir, Diagnostics& diag, const char* backendName)
{ {
m_lighting = false;
m_texSamplings.clear();
m_texMapEnd = 0;
m_tcgs.clear();
m_texMtxRefs.clear();
m_colorExpr.clear();
m_alphaExpr.clear();
diag.setBackend(backendName); diag.setBackend(backendName);
/* Final instruction is the root call by hecl convention */ /* Final instruction is the root call by hecl convention */
@ -278,14 +288,14 @@ void ProgrammableCommon::reset(const IR& ir, Diagnostics& diag, const char* back
/* Follow Color Chain */ /* Follow Color Chain */
const IR::Instruction& colorRoot = const IR::Instruction& colorRoot =
ir.m_instructions.at(rootCall.m_call.m_argInstIdxs.at(0)); ir.m_instructions.at(rootCall.m_call.m_argInstIdxs.at(0));
m_colorExpr = RecursiveTraceColor(ir, diag, colorRoot); m_colorExpr = RecursiveTraceColor(ir, diag, colorRoot, false);
/* Follow Alpha Chain */ /* Follow Alpha Chain */
if (doAlpha) if (doAlpha)
{ {
const IR::Instruction& alphaRoot = const IR::Instruction& alphaRoot =
ir.m_instructions.at(rootCall.m_call.m_argInstIdxs.at(1)); ir.m_instructions.at(rootCall.m_call.m_argInstIdxs.at(1));
m_alphaExpr = RecursiveTraceAlpha(ir, diag, alphaRoot); m_alphaExpr = RecursiveTraceAlpha(ir, diag, alphaRoot, false);
} }
} }