xref: /aosp_15_r20/external/angle/src/libANGLE/CLSampler.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // CLSampler.cpp: Implements the cl::Sampler class.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLSampler.h"
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLContext.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/cl_utils.h"
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include <cstring>
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker namespace cl
16*8975f5c5SAndroid Build Coastguard Worker {
17*8975f5c5SAndroid Build Coastguard Worker 
getInfo(SamplerInfo name,size_t valueSize,void * value,size_t * valueSizeRet) const18*8975f5c5SAndroid Build Coastguard Worker angle::Result Sampler::getInfo(SamplerInfo name,
19*8975f5c5SAndroid Build Coastguard Worker                                size_t valueSize,
20*8975f5c5SAndroid Build Coastguard Worker                                void *value,
21*8975f5c5SAndroid Build Coastguard Worker                                size_t *valueSizeRet) const
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker     static_assert(std::is_same<cl_uint, cl_addressing_mode>::value &&
24*8975f5c5SAndroid Build Coastguard Worker                       std::is_same<cl_uint, cl_filter_mode>::value,
25*8975f5c5SAndroid Build Coastguard Worker                   "OpenCL type mismatch");
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker     cl_uint valUInt       = 0u;
28*8975f5c5SAndroid Build Coastguard Worker     void *valPointer      = nullptr;
29*8975f5c5SAndroid Build Coastguard Worker     const void *copyValue = nullptr;
30*8975f5c5SAndroid Build Coastguard Worker     size_t copySize       = 0u;
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker     switch (name)
33*8975f5c5SAndroid Build Coastguard Worker     {
34*8975f5c5SAndroid Build Coastguard Worker         case SamplerInfo::ReferenceCount:
35*8975f5c5SAndroid Build Coastguard Worker             valUInt   = getRefCount();
36*8975f5c5SAndroid Build Coastguard Worker             copyValue = &valUInt;
37*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(valUInt);
38*8975f5c5SAndroid Build Coastguard Worker             break;
39*8975f5c5SAndroid Build Coastguard Worker         case SamplerInfo::Context:
40*8975f5c5SAndroid Build Coastguard Worker             valPointer = mContext->getNative();
41*8975f5c5SAndroid Build Coastguard Worker             copyValue  = &valPointer;
42*8975f5c5SAndroid Build Coastguard Worker             copySize   = sizeof(valPointer);
43*8975f5c5SAndroid Build Coastguard Worker             break;
44*8975f5c5SAndroid Build Coastguard Worker         case SamplerInfo::NormalizedCoords:
45*8975f5c5SAndroid Build Coastguard Worker             copyValue = &mNormalizedCoords;
46*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(mNormalizedCoords);
47*8975f5c5SAndroid Build Coastguard Worker             break;
48*8975f5c5SAndroid Build Coastguard Worker         case SamplerInfo::AddressingMode:
49*8975f5c5SAndroid Build Coastguard Worker             valUInt   = ToCLenum(mAddressingMode);
50*8975f5c5SAndroid Build Coastguard Worker             copyValue = &valUInt;
51*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(valUInt);
52*8975f5c5SAndroid Build Coastguard Worker             break;
53*8975f5c5SAndroid Build Coastguard Worker         case SamplerInfo::FilterMode:
54*8975f5c5SAndroid Build Coastguard Worker             valUInt   = ToCLenum(mFilterMode);
55*8975f5c5SAndroid Build Coastguard Worker             copyValue = &valUInt;
56*8975f5c5SAndroid Build Coastguard Worker             copySize  = sizeof(valUInt);
57*8975f5c5SAndroid Build Coastguard Worker             break;
58*8975f5c5SAndroid Build Coastguard Worker         case SamplerInfo::Properties:
59*8975f5c5SAndroid Build Coastguard Worker             copyValue = mProperties.data();
60*8975f5c5SAndroid Build Coastguard Worker             copySize  = mProperties.size() * sizeof(decltype(mProperties)::value_type);
61*8975f5c5SAndroid Build Coastguard Worker             break;
62*8975f5c5SAndroid Build Coastguard Worker         default:
63*8975f5c5SAndroid Build Coastguard Worker             ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
64*8975f5c5SAndroid Build Coastguard Worker     }
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker     if (value != nullptr)
67*8975f5c5SAndroid Build Coastguard Worker     {
68*8975f5c5SAndroid Build Coastguard Worker         // CL_INVALID_VALUE if size in bytes specified by param_value_size is < size of return type
69*8975f5c5SAndroid Build Coastguard Worker         // as described in the Sampler Object Queries table and param_value is not NULL.
70*8975f5c5SAndroid Build Coastguard Worker         if (valueSize < copySize)
71*8975f5c5SAndroid Build Coastguard Worker         {
72*8975f5c5SAndroid Build Coastguard Worker             ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
73*8975f5c5SAndroid Build Coastguard Worker         }
74*8975f5c5SAndroid Build Coastguard Worker         if (copyValue != nullptr)
75*8975f5c5SAndroid Build Coastguard Worker         {
76*8975f5c5SAndroid Build Coastguard Worker             std::memcpy(value, copyValue, copySize);
77*8975f5c5SAndroid Build Coastguard Worker         }
78*8975f5c5SAndroid Build Coastguard Worker     }
79*8975f5c5SAndroid Build Coastguard Worker     if (valueSizeRet != nullptr)
80*8975f5c5SAndroid Build Coastguard Worker     {
81*8975f5c5SAndroid Build Coastguard Worker         *valueSizeRet = copySize;
82*8975f5c5SAndroid Build Coastguard Worker     }
83*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
84*8975f5c5SAndroid Build Coastguard Worker }
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker Sampler::~Sampler() = default;
87*8975f5c5SAndroid Build Coastguard Worker 
Sampler(Context & context,PropArray && properties,cl_bool normalizedCoords,AddressingMode addressingMode,FilterMode filterMode)88*8975f5c5SAndroid Build Coastguard Worker Sampler::Sampler(Context &context,
89*8975f5c5SAndroid Build Coastguard Worker                  PropArray &&properties,
90*8975f5c5SAndroid Build Coastguard Worker                  cl_bool normalizedCoords,
91*8975f5c5SAndroid Build Coastguard Worker                  AddressingMode addressingMode,
92*8975f5c5SAndroid Build Coastguard Worker                  FilterMode filterMode)
93*8975f5c5SAndroid Build Coastguard Worker     : mContext(&context),
94*8975f5c5SAndroid Build Coastguard Worker       mProperties(std::move(properties)),
95*8975f5c5SAndroid Build Coastguard Worker       mNormalizedCoords(normalizedCoords),
96*8975f5c5SAndroid Build Coastguard Worker       mAddressingMode(addressingMode),
97*8975f5c5SAndroid Build Coastguard Worker       mFilterMode(filterMode),
98*8975f5c5SAndroid Build Coastguard Worker       mImpl(nullptr)
99*8975f5c5SAndroid Build Coastguard Worker {
100*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CL_IMPL_TRY(context.getImpl().createSampler(*this, &mImpl));
101*8975f5c5SAndroid Build Coastguard Worker }
102*8975f5c5SAndroid Build Coastguard Worker 
103*8975f5c5SAndroid Build Coastguard Worker }  // namespace cl
104