// static ImmutableString ImageFunctionHLSL::GetImageReference( TInfoSinkBase &out, const ImageFunctionHLSL::ImageFunction &imageFunction) { static const ImmutableString kImageIndexStr("[index]"); if (imageFunction.readonly) { static const ImmutableString kReadonlyImagesStr("readonlyImages"); ImmutableString suffix( TextureGroupSuffix(imageFunction.image, imageFunction.imageInternalFormat)); out << " const uint index = imageIndex - readonlyImageIndexOffset" << suffix.data() << ";\n"; ImmutableStringBuilder imageRefBuilder(kReadonlyImagesStr.length() + suffix.length() + kImageIndexStr.length()); imageRefBuilder << kReadonlyImagesStr << suffix << kImageIndexStr; return imageRefBuilder; } else { static const ImmutableString kImagesStr("images"); ImmutableString suffix( RWTextureGroupSuffix(imageFunction.image, imageFunction.imageInternalFormat)); out << " const uint index = imageIndex - imageIndexOffset" << suffix.data() << ";\n"; ImmutableStringBuilder imageRefBuilder(kImagesStr.length() + suffix.length() + kImageIndexStr.length()); imageRefBuilder << kImagesStr << suffix << kImageIndexStr; return imageRefBuilder; } }
void UniformHLSL::outputHLSLSamplerUniformGroup(TInfoSinkBase &out, const HLSLTextureSamplerGroup textureGroup, const TVector<const TIntermSymbol *> &group, unsigned int *groupTextureRegisterIndex) { if (group.empty()) { return; } unsigned int groupRegisterCount = 0; for (const TIntermSymbol *uniform : group) { const TType &type = uniform->getType(); const TString &name = uniform->getSymbol(); unsigned int registerCount; unsigned int samplerArrayIndex = declareUniformAndAssignRegister(type, name, ®isterCount); groupRegisterCount += registerCount; if (type.isArray()) { out << "static const uint " << DecorateIfNeeded(uniform->getName()) << ArrayString(type) << " = {"; for (int i = 0; i < type.getArraySize(); ++i) { if (i > 0) out << ", "; out << (samplerArrayIndex + i); } out << "};\n"; } else { out << "static const uint " << DecorateIfNeeded(uniform->getName()) << " = " << samplerArrayIndex << ";\n"; } } TString suffix = TextureGroupSuffix(textureGroup); // Since HLSL_TEXTURE_2D is the first group, it has a fixed offset of zero. if (textureGroup != HLSL_TEXTURE_2D) { out << "static const uint textureIndexOffset" << suffix << " = " << (*groupTextureRegisterIndex) << ";\n"; out << "static const uint samplerIndexOffset" << suffix << " = " << (*groupTextureRegisterIndex) << ";\n"; } out << "uniform " << TextureString(textureGroup) << " textures" << suffix << "[" << groupRegisterCount << "]" << " : register(t" << (*groupTextureRegisterIndex) << ");\n"; out << "uniform " << SamplerString(textureGroup) << " samplers" << suffix << "[" << groupRegisterCount << "]" << " : register(s" << (*groupTextureRegisterIndex) << ");\n"; *groupTextureRegisterIndex += groupRegisterCount; }
TString TextureTypeSuffix(const TBasicType type) { switch (type) { case EbtISamplerCube: return "Cube_int4_"; case EbtUSamplerCube: return "Cube_uint4_"; default: // All other types are identified by their group suffix return TextureGroupSuffix(type); } }
const char *TextureTypeSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat) { switch (type) { case EbtISamplerCube: return "Cube_int4_"; case EbtUSamplerCube: return "Cube_uint4_"; case EbtSamplerExternalOES: return "_External"; case EbtImageCube: { switch (imageInternalFormat) { case EiifRGBA32F: case EiifRGBA16F: case EiifR32F: return "Cube_float4_"; case EiifRGBA8: return "Cube_unorm_float4_"; case EiifRGBA8_SNORM: return "Cube_snorm_float4_"; default: UNREACHABLE(); } #if !UNREACHABLE_IS_NORETURN break; #endif } case EbtIImageCube: { switch (imageInternalFormat) { case EiifRGBA32I: case EiifRGBA16I: case EiifRGBA8I: case EiifR32I: return "Cube_int4_"; default: UNREACHABLE(); } #if !UNREACHABLE_IS_NORETURN break; #endif } case EbtUImageCube: { switch (imageInternalFormat) { case EiifRGBA32UI: case EiifRGBA16UI: case EiifRGBA8UI: case EiifR32UI: return "Cube_uint4_"; default: UNREACHABLE(); } #if !UNREACHABLE_IS_NORETURN break; #endif } default: // All other types are identified by their group suffix return TextureGroupSuffix(type, imageInternalFormat); } #if !UNREACHABLE_IS_NORETURN UNREACHABLE(); return "_TTS_invalid_"; #endif }
const char *TextureGroupSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat) { return TextureGroupSuffix(TextureGroup(type, imageInternalFormat)); }
void UniformHLSL::outputHLSLSamplerUniformGroup( TInfoSinkBase &out, const HLSLTextureSamplerGroup textureGroup, const TVector<const TIntermSymbol *> &group, const TMap<const TIntermSymbol *, TString> &samplerInStructSymbolsToAPINames, unsigned int *groupTextureRegisterIndex) { if (group.empty()) { return; } unsigned int groupRegisterCount = 0; for (const TIntermSymbol *uniform : group) { const TType &type = uniform->getType(); const TString &name = uniform->getSymbol(); unsigned int registerCount; // The uniform might be just a regular sampler or one extracted from a struct. unsigned int samplerArrayIndex = 0u; const Uniform *uniformByName = findUniformByName(name); if (uniformByName) { samplerArrayIndex = assignUniformRegister(type, name, ®isterCount); } else { ASSERT(samplerInStructSymbolsToAPINames.find(uniform) != samplerInStructSymbolsToAPINames.end()); samplerArrayIndex = assignSamplerInStructUniformRegister( type, samplerInStructSymbolsToAPINames.at(uniform), ®isterCount); } groupRegisterCount += registerCount; if (type.isArray()) { out << "static const uint " << DecorateIfNeeded(uniform->getName()) << ArrayString(type) << " = {"; for (unsigned int i = 0u; i < type.getArraySize(); ++i) { if (i > 0u) out << ", "; out << (samplerArrayIndex + i); } out << "};\n"; } else { out << "static const uint " << DecorateIfNeeded(uniform->getName()) << " = " << samplerArrayIndex << ";\n"; } } TString suffix = TextureGroupSuffix(textureGroup); // Since HLSL_TEXTURE_2D is the first group, it has a fixed offset of zero. if (textureGroup != HLSL_TEXTURE_2D) { out << "static const uint textureIndexOffset" << suffix << " = " << (*groupTextureRegisterIndex) << ";\n"; out << "static const uint samplerIndexOffset" << suffix << " = " << (*groupTextureRegisterIndex) << ";\n"; } out << "uniform " << TextureString(textureGroup) << " textures" << suffix << "[" << groupRegisterCount << "]" << " : register(t" << (*groupTextureRegisterIndex) << ");\n"; out << "uniform " << SamplerString(textureGroup) << " samplers" << suffix << "[" << groupRegisterCount << "]" << " : register(s" << (*groupTextureRegisterIndex) << ");\n"; *groupTextureRegisterIndex += groupRegisterCount; }
TString TextureGroupSuffix(const TBasicType type) { return TextureGroupSuffix(TextureGroup(type)); }