GlyphCache::GlyphCache() { glyph_list.reserve(256); // Note, the user can specify a different texture group size using set_texture_group() texture_group = TextureGroup(Size(256,256)); // Set default font metrics font_metrics = FontMetrics( 0,0, 0, 0,0,0,0,0, 0,0, false, false, false, false); anti_alias = true; enable_subpixel = true; }
const char *TextureGroupSuffix(const TBasicType type, TLayoutImageInternalFormat imageInternalFormat) { return TextureGroupSuffix(TextureGroup(type, imageInternalFormat)); }
void UniformHLSL::uniformsHeader(TInfoSinkBase &out, ShShaderOutput outputType, const ReferencedSymbols &referencedUniforms) { if (!referencedUniforms.empty()) { out << "// Uniforms\n\n"; } // In the case of HLSL 4, sampler uniforms need to be grouped by type before the code is // written. They are grouped based on the combination of the HLSL texture type and // HLSL sampler type, enumerated in HLSLTextureSamplerGroup. TVector<TVector<const TIntermSymbol *>> groupedSamplerUniforms(HLSL_TEXTURE_MAX + 1); TMap<const TIntermSymbol *, TString> samplerInStructSymbolsToAPINames; for (auto &uniformIt : referencedUniforms) { // Output regular uniforms. Group sampler uniforms by type. const TIntermSymbol &uniform = *uniformIt.second; const TType &type = uniform.getType(); const TName &name = uniform.getName(); if (outputType == SH_HLSL_4_1_OUTPUT && IsSampler(type.getBasicType())) { HLSLTextureSamplerGroup group = TextureGroup(type.getBasicType()); groupedSamplerUniforms[group].push_back(&uniform); } else if (outputType == SH_HLSL_4_0_FL9_3_OUTPUT && IsSampler(type.getBasicType())) { unsigned int registerIndex = assignUniformRegister(type, name.getString(), nullptr); outputHLSL4_0_FL9_3Sampler(out, type, name, registerIndex); } else { if (type.isStructureContainingSamplers()) { TVector<TIntermSymbol *> samplerSymbols; TMap<TIntermSymbol *, TString> symbolsToAPINames; unsigned int arrayOfStructsSize = type.isArray() ? type.getArraySize() : 0u; type.createSamplerSymbols("angle_" + name.getString(), name.getString(), arrayOfStructsSize, &samplerSymbols, &symbolsToAPINames); for (TIntermSymbol *sampler : samplerSymbols) { const TType &samplerType = sampler->getType(); // Will use angle_ prefix instead of regular prefix. sampler->setInternal(true); const TName &samplerName = sampler->getName(); if (outputType == SH_HLSL_4_1_OUTPUT) { HLSLTextureSamplerGroup group = TextureGroup(samplerType.getBasicType()); groupedSamplerUniforms[group].push_back(sampler); samplerInStructSymbolsToAPINames[sampler] = symbolsToAPINames[sampler]; } else if (outputType == SH_HLSL_4_0_FL9_3_OUTPUT) { unsigned int registerIndex = assignSamplerInStructUniformRegister( samplerType, symbolsToAPINames[sampler], nullptr); outputHLSL4_0_FL9_3Sampler(out, samplerType, samplerName, registerIndex); } else { ASSERT(outputType == SH_HLSL_3_0_OUTPUT); unsigned int registerIndex = assignSamplerInStructUniformRegister( samplerType, symbolsToAPINames[sampler], nullptr); outputUniform(out, samplerType, samplerName, registerIndex); } } } unsigned int registerIndex = assignUniformRegister(type, name.getString(), nullptr); outputUniform(out, type, name, registerIndex); } } if (outputType == SH_HLSL_4_1_OUTPUT) { unsigned int groupTextureRegisterIndex = 0; // TEXTURE_2D is special, index offset is assumed to be 0 and omitted in that case. ASSERT(HLSL_TEXTURE_MIN == HLSL_TEXTURE_2D); for (int groupId = HLSL_TEXTURE_MIN; groupId < HLSL_TEXTURE_MAX; ++groupId) { outputHLSLSamplerUniformGroup( out, HLSLTextureSamplerGroup(groupId), groupedSamplerUniforms[groupId], samplerInStructSymbolsToAPINames, &groupTextureRegisterIndex); } } }
TString TextureGroupSuffix(const TBasicType type) { return TextureGroupSuffix(TextureGroup(type)); }
TString TextureString(const TBasicType type) { return TextureString(TextureGroup(type)); }
void UniformHLSL::uniformsHeader(TInfoSinkBase &out, ShShaderOutput outputType, const ReferencedSymbols &referencedUniforms) { if (!referencedUniforms.empty()) { out << "// Uniforms\n\n"; } // In the case of HLSL 4, sampler uniforms need to be grouped by type before the code is // written. They are grouped based on the combination of the HLSL texture type and // HLSL sampler type, enumerated in HLSLTextureSamplerGroup. TVector<TVector<const TIntermSymbol *>> groupedSamplerUniforms; groupedSamplerUniforms.resize(HLSL_TEXTURE_MAX + 1); for (auto &uniformIt : referencedUniforms) { // Output regular uniforms. Group sampler uniforms by type. const TIntermSymbol &uniform = *uniformIt.second; const TType &type = uniform.getType(); const TString &name = uniform.getSymbol(); if (outputType == SH_HLSL_4_1_OUTPUT && IsSampler(type.getBasicType())) { HLSLTextureSamplerGroup group = TextureGroup(type.getBasicType()); groupedSamplerUniforms[group].push_back(&uniform); } else if (outputType == SH_HLSL_4_0_FL9_3_OUTPUT && IsSampler(type.getBasicType())) { unsigned int registerIndex = declareUniformAndAssignRegister(type, name); out << "uniform " << SamplerString(type.getBasicType()) << " sampler_" << DecorateUniform(name, type) << ArrayString(type) << " : register(s" << str(registerIndex) << ");\n"; out << "uniform " << TextureString(type.getBasicType()) << " texture_" << DecorateUniform(name, type) << ArrayString(type) << " : register(t" << str(registerIndex) << ");\n"; } else { unsigned int registerIndex = declareUniformAndAssignRegister(type, name); const TStructure *structure = type.getStruct(); // If this is a nameless struct, we need to use its full definition, rather than its (empty) name. // TypeString() will invoke defineNameless in this case; qualifier prefixes are unnecessary for // nameless structs in ES, as nameless structs cannot be used anywhere that layout qualifiers are // permitted. const TString &typeName = ((structure && !structure->name().empty()) ? QualifiedStructNameString(*structure, false, false) : TypeString(type)); const TString ®isterString = TString("register(") + UniformRegisterPrefix(type) + str(registerIndex) + ")"; out << "uniform " << typeName << " " << DecorateUniform(name, type) << ArrayString(type) << " : " << registerString << ";\n"; } } if (outputType == SH_HLSL_4_1_OUTPUT) { unsigned int groupTextureRegisterIndex = 0; // TEXTURE_2D is special, index offset is assumed to be 0 and omitted in that case. ASSERT(HLSL_TEXTURE_MIN == HLSL_TEXTURE_2D); for (int groupId = HLSL_TEXTURE_MIN; groupId < HLSL_TEXTURE_MAX; ++groupId) { outputHLSLSamplerUniformGroup(out, HLSLTextureSamplerGroup(groupId), groupedSamplerUniforms[groupId], &groupTextureRegisterIndex); } } }