protected void EmitShaderSetup(
EmitContextHLSL hlslContext,
string profile,
string stageName,
string prefix)
{
var hlslSpan = hlslContext.Span;
var bytecode = hlslContext.Compile(profile);
InitBlock.AppendComment(hlslContext.Span);
if (bytecode != null && bytecode.Length > 0)
EmitTarget.ShaderBytecodeCallback(prefix, bytecode);
var bytecodeLengthVal = InitBlock.Temp(
"bytecodeSize",
InitBlock.LiteralU32(
(UInt32)bytecode.Length));
var bytecodeVal = InitBlock.Temp(
"bytecode",
InitBlock.LiteralData(bytecode));
// Terrible hack - save off vals in case of vertex shader... :(
// This is required because creating an Input Layout
// requires VS bytecode... for some reason...
if (prefix == "VS")
{
EmitPass.VertexShaderBytecodeVal = bytecodeVal;
EmitPass.VertexShaderBytecodeSizeVal = bytecodeLengthVal;
}
var shaderType = EmitTarget.GetOpaqueType(
string.Format("ID3D11{0}Shader*", stageName));
var shaderNull = EmitTarget.GetNullPointer(shaderType);
_shaderField = EmitClass.AddPrivateField(
shaderType,
string.Format("_{0}Shader", stageName));
InitBlock.SetArrow(
CtorThis,
_shaderField,
shaderNull);
var classLinkageNull = EmitTarget.GetNullPointer(
EmitTarget.GetOpaqueType("ID3D11ClassLinkage*"));
InitBlock.CallCOM(
CtorDevice,
"ID3D11Device",
string.Format("Create{0}Shader", stageName),
bytecodeVal,
bytecodeLengthVal,
classLinkageNull,
InitBlock.GetArrow(CtorThis, _shaderField).GetAddress());
DtorBlock.CallCOM(
DtorBlock.GetArrow(DtorThis, _shaderField),
"IUnknown",
"Release");
}