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