1 //
2 // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // CLSamplerVk.cpp: Implements the class methods for CLSamplerVk.
7
8 #include "libANGLE/renderer/vulkan/CLSamplerVk.h"
9 #include "common/PackedCLEnums_autogen.h"
10 #include "libANGLE/renderer/vulkan/CLContextVk.h"
11
12 #include "libANGLE/CLContext.h"
13 #include "libANGLE/CLSampler.h"
14 #include "libANGLE/cl_utils.h"
15 #include "libANGLE/renderer/vulkan/ContextVk.h"
16
17 using namespace clspv;
18
19 namespace rx
20 {
21
getVkAddressMode()22 VkSamplerAddressMode CLSamplerVk::getVkAddressMode()
23 {
24 VkSamplerAddressMode addressMode;
25 switch (mSampler.getAddressingMode())
26 {
27 case cl::AddressingMode::None:
28 addressMode = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
29 break;
30 case cl::AddressingMode::ClampToEdge:
31 addressMode = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
32 break;
33 case cl::AddressingMode::Clamp:
34 addressMode = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
35 break;
36 case cl::AddressingMode::Repeat:
37 addressMode = VK_SAMPLER_ADDRESS_MODE_REPEAT;
38 break;
39 case cl::AddressingMode::MirroredRepeat:
40 addressMode = VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT;
41 break;
42 default:
43 addressMode = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
44 break;
45 }
46
47 if (!mSampler.getNormalizedCoords() && (addressMode != VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE &&
48 addressMode != VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER))
49 {
50 addressMode = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
51 }
52
53 return addressMode;
54 }
55
getVkFilter()56 VkFilter CLSamplerVk::getVkFilter()
57 {
58 switch (mSampler.getFilterMode())
59 {
60 case cl::FilterMode::Nearest:
61 return VK_FILTER_NEAREST;
62 case cl::FilterMode::Linear:
63 return VK_FILTER_LINEAR;
64 default:
65 return VK_FILTER_LINEAR;
66 }
67 }
68
getVkMipmapMode()69 VkSamplerMipmapMode CLSamplerVk::getVkMipmapMode()
70 {
71 if (mSampler.getNormalizedCoords())
72 {
73 switch (mSampler.getFilterMode())
74 {
75 case cl::FilterMode::Nearest:
76 return VK_SAMPLER_MIPMAP_MODE_NEAREST;
77 case cl::FilterMode::Linear:
78 return VK_SAMPLER_MIPMAP_MODE_LINEAR;
79 default:
80 return VK_SAMPLER_MIPMAP_MODE_LINEAR;
81 }
82 }
83
84 return VK_SAMPLER_MIPMAP_MODE_NEAREST;
85 }
86
getSamplerMask()87 uint32_t CLSamplerVk::getSamplerMask()
88 {
89 uint32_t mask = 0;
90 if (mSampler.getNormalizedCoords())
91 {
92 mask |= SamplerNormalizedCoords::CLK_NORMALIZED_COORDS_TRUE;
93 }
94 switch (mSampler.getAddressingMode())
95 {
96 case cl::AddressingMode::None:
97 break;
98 case cl::AddressingMode::ClampToEdge:
99 mask |= SamplerAddressingMode::CLK_ADDRESS_CLAMP_TO_EDGE;
100 break;
101 case cl::AddressingMode::Clamp:
102 mask |= SamplerAddressingMode::CLK_ADDRESS_CLAMP;
103 break;
104 case cl::AddressingMode::Repeat:
105 mask |= SamplerAddressingMode::CLK_ADDRESS_REPEAT;
106 break;
107 case cl::AddressingMode::MirroredRepeat:
108 mask |= SamplerAddressingMode::CLK_ADDRESS_MIRRORED_REPEAT;
109 break;
110 default:
111 break;
112 }
113 switch (mSampler.getFilterMode())
114 {
115 case cl::FilterMode::Nearest:
116 mask |= SamplerFilterMode::CLK_FILTER_NEAREST;
117 break;
118 case cl::FilterMode::Linear:
119 default:
120 mask |= SamplerFilterMode::CLK_FILTER_LINEAR;
121 break;
122 }
123 return mask;
124 }
125
CLSamplerVk(const cl::Sampler & sampler)126 CLSamplerVk::CLSamplerVk(const cl::Sampler &sampler)
127 : CLSamplerImpl(sampler),
128 mContext(&sampler.getContext().getImpl<CLContextVk>()),
129 mRenderer(mContext->getRenderer()),
130 mSamplerHelper(),
131 mSamplerHelperNormalized()
132 {
133 VkSamplerAddressMode addressMode = getVkAddressMode();
134 VkFilter filter = getVkFilter();
135 VkSamplerMipmapMode mipmapMode = getVkMipmapMode();
136 VkBool32 unnormalizedCoordinates = !(mSampler.getNormalizedCoords());
137
138 mDefaultSamplerCreateInfo = {
139 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
140 .pNext = nullptr,
141 .flags = 0x0,
142 .magFilter = filter,
143 .minFilter = filter,
144 .mipmapMode = mipmapMode,
145 .addressModeU = addressMode,
146 .addressModeV = addressMode,
147 .addressModeW = addressMode,
148 .mipLodBias = 0.0f,
149 .anisotropyEnable = VK_FALSE,
150 .maxAnisotropy = 0.0f,
151 .compareEnable = VK_FALSE,
152 .compareOp = VK_COMPARE_OP_NEVER,
153 .minLod = 0.0f,
154 .maxLod = 0.0f,
155 .borderColor = VK_BORDER_COLOR_INT_TRANSPARENT_BLACK,
156 .unnormalizedCoordinates = unnormalizedCoordinates,
157 };
158 }
159
~CLSamplerVk()160 CLSamplerVk::~CLSamplerVk()
161 {
162 mSamplerHelper.destroy(mContext->getDevice());
163 if (mSamplerHelperNormalized.valid())
164 {
165 mSamplerHelperNormalized.destroy(mContext->getDevice());
166 }
167 }
168
create()169 angle::Result CLSamplerVk::create()
170 {
171 ANGLE_TRY(mSamplerHelper.init(mContext, mDefaultSamplerCreateInfo));
172
173 return angle::Result::Continue;
174 }
175
createNormalized()176 angle::Result CLSamplerVk::createNormalized()
177 {
178 if (mSamplerHelperNormalized.valid())
179 {
180 mDefaultSamplerCreateInfo.unnormalizedCoordinates = false;
181 ANGLE_TRY(mSamplerHelperNormalized.init(mContext, mDefaultSamplerCreateInfo));
182 }
183
184 return angle::Result::Continue;
185 }
186
187 } // namespace rx
188