31 #include <unordered_set>
32 #include <unordered_map>
65 Object {std::move(Key.Object) },
162 const Char* HLSLSource,
169 struct HLSLObjectInfo
188 struct ObjectsTypeHashType
192 ObjectsTypeHashType() noexcept {}
193 ObjectsTypeHashType(ObjectsTypeHashType&& rhs) noexcept :
197 ObjectsTypeHashType& operator = (ObjectsTypeHashType&&) =
delete;
198 ObjectsTypeHashType (ObjectsTypeHashType&) =
delete;
199 ObjectsTypeHashType& operator = (ObjectsTypeHashType&) =
delete;
202 std::unordered_map<HashMapStringKey, HLSLObjectInfo, HashMapStringKey::Hasher> m;
209 GLSLStubInfo(
const String& _Name,
const char* _Swizzle) :
217 std::unordered_map<FunctionStubHashKey, GLSLStubInfo, FunctionStubHashKey::Hasher> m_GLSLStubs;
223 #define ADD_KEYWORD(keyword)kw_##keyword,
226 PreprocessorDirective,
257 bool IsBuiltInType()
const
259 static_assert(
static_cast<int>(TokenType::kw_bool) == 1 &&
static_cast<int>(TokenType::kw_void) == 191,
260 "If you updated built-in types, double check that all types are defined between bool and void");
261 return Type >= TokenType::kw_bool &&
Type <= TokenType::kw_void;
264 bool IsFlowControl()
const
266 static_assert(
static_cast<int>(TokenType::kw_break) == 192 &&
static_cast<int>(TokenType::kw_while) == 202,
267 "If you updated control flow keywords, double check that all keywords are defined between break and while");
268 return Type >= TokenType::kw_break &&
Type <= TokenType::kw_while;
271 TokenInfo(TokenType _Type = TokenType::Undefined,
272 const Char* _Literal =
"",
273 const Char* _Delimiter =
"") :
276 Delimiter{_Delimiter}
279 typedef std::list<TokenInfo> TokenListType;
282 class ConversionStream :
public ObjectBase<IHLSL2GLSLConversionStream>
285 using TBase = ObjectBase<IHLSL2GLSLConversionStream>;
302 ConversionStream(IReferenceCounters* pRefCounters,
303 const HLSL2GLSLConverterImpl& Converter,
304 const char* InputFileName,
305 IShaderSourceInputStreamFactory* pInputStreamFactory,
306 const Char* HLSLSource,
308 bool bPreserveTokens);
312 bool IncludeDefintions,
313 const char* SamplerSuffix,
314 bool UseInOutLocationQualifiers);
318 bool IncludeDefintions,
319 const char* SamplerSuffix,
320 bool UseInOutLocationQualifiers,
321 IDataBlob** ppGLSLSource)
override final;
325 const String& GetInputFileName()
const {
return m_InputFileName; }
328 void InsertIncludes(
String& GLSLSource, IShaderSourceInputStreamFactory* pSourceStreamFactory);
329 void Tokenize(
const String& Source);
331 typedef std::unordered_map<String, bool> SamplerHashType;
333 const HLSLObjectInfo* FindHLSLObject(
const String& Name);
337 void ProcessObjectMethods(
const TokenListType::iterator& ScopeStart,
const TokenListType::iterator& ScopeEnd);
339 void ProcessRWTextures(
const TokenListType::iterator& ScopeStart,
const TokenListType::iterator& ScopeEnd);
341 void ProcessAtomics(
const TokenListType::iterator& ScopeStart,
342 const TokenListType::iterator& ScopeEnd);
344 void RegisterStruct(TokenListType::iterator& Token);
346 void ProcessConstantBuffer(TokenListType::iterator& Token);
347 void ProcessStructuredBuffer(TokenListType::iterator& Token,
Uint32& ShaderStorageBlockBinding);
348 void ParseSamplers(TokenListType::iterator& ScopeStart, SamplerHashType& SamplersHash);
350 void ProcessTextureDeclaration(TokenListType::iterator& Token,
351 const std::vector<SamplerHashType>& SamplersHash,
352 ObjectsTypeHashType& Objects,
353 const char* SamplerSuffix,
356 bool ProcessObjectMethod(TokenListType::iterator& Token,
357 const TokenListType::iterator& ScopeStart,
358 const TokenListType::iterator& ScopeEnd);
360 Uint32 CountFunctionArguments(TokenListType::iterator& Token,
const TokenListType::iterator& ScopeEnd);
361 bool ProcessRWTextureStore(TokenListType::iterator& Token,
const TokenListType::iterator& ScopeEnd,
Uint32 ArrayDim);
362 bool ProcessRWTextureLoad(TokenListType::iterator& Token,
const TokenListType::iterator& ScopeEnd,
Uint32 ArrayDim);
363 void RemoveFlowControlAttribute(TokenListType::iterator& Token);
364 void RemoveSemantics();
365 void RemoveSpecialShaderAttributes();
366 void RemoveSemanticsFromBlock(TokenListType::iterator& Token, TokenType OpenBracketType, TokenType ClosingBracketType);
367 void RemoveSamplerRegister(TokenListType::iterator& Token);
373 template <
typename IteratorType>
374 String PrintTokenContext(IteratorType& TargetToken,
Int32 NumAdjacentLines);
376 struct ShaderParameterInfo
378 enum class StorageQualifier :
Int8
431 std::vector<ShaderParameterInfo> members;
433 ShaderParameterInfo() :
434 storageQualifier{StorageQualifier::Unknown}
437 void ParseShaderParameter(TokenListType::iterator& Token,
438 ShaderParameterInfo& ParamInfo);
439 void ProcessFunctionParameters(TokenListType::iterator& Token,
440 std::vector<ShaderParameterInfo>& Params,
442 bool RequiresFlatQualifier(
const String&
Type);
443 void ProcessFragmentShaderArguments(std::vector<ShaderParameterInfo>& Params,
445 std::stringstream& ReturnHandlerSS,
448 String BuildParameterName(
const std::vector<const ShaderParameterInfo*>& MemberStack,
450 const Char* Prefix =
"",
451 const Char* SubstituteInstName =
"",
452 const Char* Index =
"");
454 template <
typename THandler>
455 void ProcessScope(TokenListType::iterator& Token,
456 TokenListType::iterator ScopeEnd,
457 TokenType OpenParenType,
458 TokenType ClosingParenType,
461 template <
typename TArgHandler>
462 void ProcessShaderArgument(
const ShaderParameterInfo& Param,
465 std::stringstream& PrologueSS,
466 TArgHandler ArgHandler);
468 void ProcessVertexShaderArguments(std::vector<ShaderParameterInfo>& Params,
470 std::stringstream& ReturnHandlerSS,
473 void ProcessGeometryShaderArguments(TokenListType::iterator& TypeToken,
474 std::vector<ShaderParameterInfo>& Params,
478 void ProcessHullShaderConstantFunction(
const Char* FuncName,
bool& bTakesInputPatch);
480 void ProcessShaderAttributes(TokenListType::iterator& TypeToken,
481 std::unordered_map<HashMapStringKey, String, HashMapStringKey::Hasher>& Attributes);
483 void ProcessHullShaderArguments(TokenListType::iterator& TypeToken,
484 std::vector<ShaderParameterInfo>& Params,
486 std::stringstream& ReturnHandlerSS,
488 void ProcessDomainShaderArguments(TokenListType::iterator& TypeToken,
489 std::vector<ShaderParameterInfo>& Params,
491 std::stringstream& ReturnHandlerSS,
493 void ProcessComputeShaderArguments(TokenListType::iterator& TypeToken,
494 std::vector<ShaderParameterInfo>& Params,
498 void FindMatchingBracket(TokenListType::iterator& Token,
499 const TokenListType::iterator& ScopeEnd,
500 TokenType OpenBracketType);
502 void ProcessReturnStatements(TokenListType::iterator& Token,
504 const Char* EntryPoint,
505 const Char* MacroName);
507 void ProcessGSOutStreamOperations(TokenListType::iterator& Token,
508 const String& OutStreamName,
509 const char* EntryPoint);
514 TokenListType m_Tokens;
517 std::unordered_map<HashMapStringKey, TokenListType::iterator, HashMapStringKey::Hasher> m_StructDefinitions;
525 std::vector<ObjectsTypeHashType> m_Objects;
527 const bool m_bPreserveTokens;
528 bool m_bUseInOutLocationQualifiers =
true;
530 const HLSL2GLSLConverterImpl& m_Converter;
534 const String m_InputFileName;
539 std::unordered_map<HashMapStringKey, TokenInfo, HashMapStringKey::Hasher> m_HLSLKeywords;
542 std::unordered_set<HashMapStringKey, HashMapStringKey::Hasher> m_ImageTypes;
545 std::unordered_set<HashMapStringKey, HashMapStringKey::Hasher> m_AtomicOperations;
550 static constexpr
int InVar = 0;
551 static constexpr
int OutVar = 1;
552 static constexpr
int MaxShaderStages = 6;
554 std::array<std::array<std::unordered_map<HashMapStringKey, String, HashMapStringKey::Hasher>, 2>, MaxShaderStages> m_HLSLSemanticToGLSLVar;