1/*
2 * Copyright (C) 2019 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "WHLSLResourceSemantic.h"
28
29#if ENABLE(WEBGPU)
30
31#include "WHLSLAddressSpace.h"
32#include "WHLSLArrayType.h"
33#include "WHLSLInferTypes.h"
34#include "WHLSLIntrinsics.h"
35#include "WHLSLReferenceType.h"
36#include "WHLSLTypeReference.h"
37
38namespace WebCore {
39
40namespace WHLSL {
41
42namespace AST {
43
44bool ResourceSemantic::isAcceptableType(const UnnamedType& unnamedType, const Intrinsics& intrinsics) const
45{
46 switch (m_mode) {
47 case Mode::UnorderedAccessView:
48 if (is<ReferenceType>(unnamedType)) {
49 auto& referenceType = downcast<ReferenceType>(unnamedType);
50 return referenceType.addressSpace() == AddressSpace::Constant || referenceType.addressSpace() == AddressSpace::Device;
51 }
52 if (is<ArrayType>(unnamedType))
53 return true;
54 if (is<TypeReference>(unnamedType)) {
55 auto& typeReference = downcast<TypeReference>(unnamedType);
56 ASSERT(typeReference.resolvedType());
57 if (is<NativeTypeDeclaration>(*typeReference.resolvedType()))
58 return downcast<NativeTypeDeclaration>(*typeReference.resolvedType()).isTexture();
59 }
60 return false;
61 case Mode::Texture:
62 if (is<ReferenceType>(unnamedType))
63 return downcast<ReferenceType>(unnamedType).addressSpace() == AddressSpace::Constant;
64 if (is<ArrayType>(unnamedType))
65 return true;
66 if (is<TypeReference>(unnamedType)) {
67 auto& typeReference = downcast<TypeReference>(unnamedType);
68 ASSERT(typeReference.resolvedType());
69 if (is<NativeTypeDeclaration>(*typeReference.resolvedType()))
70 return downcast<NativeTypeDeclaration>(*typeReference.resolvedType()).isTexture();
71 }
72 return false;
73 case Mode::Buffer:
74 if (is<ReferenceType>(unnamedType))
75 return downcast<ReferenceType>(unnamedType).addressSpace() == AddressSpace::Constant;
76 return is<ArrayType>(unnamedType);
77 case Mode::Sampler:
78 return matches(unnamedType, intrinsics.samplerType());
79 }
80}
81
82bool ResourceSemantic::isAcceptableForShaderItemDirection(ShaderItemDirection direction, const Optional<EntryPointType>&) const
83{
84 return direction == ShaderItemDirection::Input;
85}
86
87} // namespace AST
88
89}
90
91}
92
93#endif
94