xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/CLSamplerVk.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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