| 717 | } |
| 718 | |
| 719 | void SplitCoordVec( ASTNode* call, const Type& textureType, size_t coordOffset = 1 ) |
| 720 | { |
| 721 | switch( textureType.builtInType ) |
| 722 | { |
| 723 | case OP_TEXTURE1DARRAY: |
| 724 | case OP_TEXTURE2DARRAY: |
| 725 | case OP_TEXTURE3DARRAY: |
| 726 | case OP_TEXTURECUBEARRAY: { |
| 727 | const char* xyzw = "xyzw"; |
| 728 | |
| 729 | auto coord = call->GetChild( coordOffset ); |
| 730 | ScannerToken swizzle = ScannerToken::ID( MakeInlineString( xyzw, xyzw + coord->GetType().width - 1 ) ); |
| 731 | ASTNode* dot = new ASTNode( NT_POSTFIX_EXPRESSION, coord->GetLocation(), coord->GetScope(), &swizzle ); |
| 732 | dot->AddChild( coord->Copy() ); |
| 733 | call->ReplaceChild( coordOffset, dot ); |
| 734 | |
| 735 | swizzle = ScannerToken::ID( MakeInlineString( xyzw + coord->GetType().width - 1, xyzw + coord->GetType().width ) ); |
| 736 | dot = new ASTNode( NT_POSTFIX_EXPRESSION, coord->GetLocation(), coord->GetScope(), &swizzle ); |
| 737 | dot->AddChild( coord->Copy() ); |
| 738 | |
| 739 | ScannerToken typeToken = ScannerToken::FromTokenType( OP_UINT ); |
| 740 | typeToken.intValue = 1; |
| 741 | ASTNode* cast = new ASTNode( NT_CAST_EXPRESSION, coord->GetLocation(), coord->GetScope(), &typeToken ); |
| 742 | cast->SetType( TypeFromTokenType( OP_UINT ) ); |
| 743 | cast->AddChild( dot ); |
| 744 | |
| 745 | call->InsertChild( coordOffset + 1, cast ); |
| 746 | break; |
| 747 | } |
| 748 | default: |
| 749 | break; |
| 750 | } |
| 751 | }; |
| 752 | |
| 753 | |
| 754 | void PatchMetalBufferCalls( ParserState& state, ASTNode* node ) |
no test coverage detected