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 // CLImage.cpp: Implements the cl::Image class.
7*8975f5c5SAndroid Build Coastguard Worker
8*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLImage.h"
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/CLContext.h"
10*8975f5c5SAndroid Build Coastguard Worker
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
IsTypeValid(MemObjectType imageType)18*8975f5c5SAndroid Build Coastguard Worker bool Image::IsTypeValid(MemObjectType imageType)
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker switch (imageType)
21*8975f5c5SAndroid Build Coastguard Worker {
22*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image1D:
23*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image2D:
24*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image3D:
25*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image1D_Array:
26*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image2D_Array:
27*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image1D_Buffer:
28*8975f5c5SAndroid Build Coastguard Worker break;
29*8975f5c5SAndroid Build Coastguard Worker default:
30*8975f5c5SAndroid Build Coastguard Worker return false;
31*8975f5c5SAndroid Build Coastguard Worker }
32*8975f5c5SAndroid Build Coastguard Worker return true;
33*8975f5c5SAndroid Build Coastguard Worker }
34*8975f5c5SAndroid Build Coastguard Worker
getInfo(ImageInfo name,size_t valueSize,void * value,size_t * valueSizeRet) const35*8975f5c5SAndroid Build Coastguard Worker angle::Result Image::getInfo(ImageInfo name,
36*8975f5c5SAndroid Build Coastguard Worker size_t valueSize,
37*8975f5c5SAndroid Build Coastguard Worker void *value,
38*8975f5c5SAndroid Build Coastguard Worker size_t *valueSizeRet) const
39*8975f5c5SAndroid Build Coastguard Worker {
40*8975f5c5SAndroid Build Coastguard Worker size_t valSizeT = 0u;
41*8975f5c5SAndroid Build Coastguard Worker void *valPointer = nullptr;
42*8975f5c5SAndroid Build Coastguard Worker const void *copyValue = nullptr;
43*8975f5c5SAndroid Build Coastguard Worker size_t copySize = 0u;
44*8975f5c5SAndroid Build Coastguard Worker
45*8975f5c5SAndroid Build Coastguard Worker switch (name)
46*8975f5c5SAndroid Build Coastguard Worker {
47*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::Format:
48*8975f5c5SAndroid Build Coastguard Worker copyValue = &mFormat;
49*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(mFormat);
50*8975f5c5SAndroid Build Coastguard Worker break;
51*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::ElementSize:
52*8975f5c5SAndroid Build Coastguard Worker valSizeT = GetElementSize(mFormat);
53*8975f5c5SAndroid Build Coastguard Worker copyValue = &valSizeT;
54*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(valSizeT);
55*8975f5c5SAndroid Build Coastguard Worker break;
56*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::RowPitch:
57*8975f5c5SAndroid Build Coastguard Worker copyValue = &mDesc.rowPitch;
58*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(mDesc.rowPitch);
59*8975f5c5SAndroid Build Coastguard Worker break;
60*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::SlicePitch:
61*8975f5c5SAndroid Build Coastguard Worker copyValue = &mDesc.slicePitch;
62*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(mDesc.slicePitch);
63*8975f5c5SAndroid Build Coastguard Worker break;
64*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::Width:
65*8975f5c5SAndroid Build Coastguard Worker copyValue = &mDesc.width;
66*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(mDesc.width);
67*8975f5c5SAndroid Build Coastguard Worker break;
68*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::Height:
69*8975f5c5SAndroid Build Coastguard Worker copyValue = &mDesc.height;
70*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(mDesc.height);
71*8975f5c5SAndroid Build Coastguard Worker break;
72*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::Depth:
73*8975f5c5SAndroid Build Coastguard Worker copyValue = &mDesc.depth;
74*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(mDesc.depth);
75*8975f5c5SAndroid Build Coastguard Worker break;
76*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::ArraySize:
77*8975f5c5SAndroid Build Coastguard Worker copyValue = &mDesc.arraySize;
78*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(mDesc.arraySize);
79*8975f5c5SAndroid Build Coastguard Worker break;
80*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::Buffer:
81*8975f5c5SAndroid Build Coastguard Worker valPointer = Memory::CastNative(mParent.get());
82*8975f5c5SAndroid Build Coastguard Worker copyValue = &valPointer;
83*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(valPointer);
84*8975f5c5SAndroid Build Coastguard Worker break;
85*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::NumMipLevels:
86*8975f5c5SAndroid Build Coastguard Worker copyValue = &mDesc.numMipLevels;
87*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(mDesc.numMipLevels);
88*8975f5c5SAndroid Build Coastguard Worker break;
89*8975f5c5SAndroid Build Coastguard Worker case ImageInfo::NumSamples:
90*8975f5c5SAndroid Build Coastguard Worker copyValue = &mDesc.numSamples;
91*8975f5c5SAndroid Build Coastguard Worker copySize = sizeof(mDesc.numSamples);
92*8975f5c5SAndroid Build Coastguard Worker break;
93*8975f5c5SAndroid Build Coastguard Worker default:
94*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
95*8975f5c5SAndroid Build Coastguard Worker }
96*8975f5c5SAndroid Build Coastguard Worker
97*8975f5c5SAndroid Build Coastguard Worker if (value != nullptr)
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker // CL_INVALID_VALUE if size in bytes specified by param_value_size is < size of return type
100*8975f5c5SAndroid Build Coastguard Worker // as described in the Image Object Queries table and param_value is not NULL.
101*8975f5c5SAndroid Build Coastguard Worker if (valueSize < copySize)
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_RETURN_ERROR(CL_INVALID_VALUE);
104*8975f5c5SAndroid Build Coastguard Worker }
105*8975f5c5SAndroid Build Coastguard Worker if (copyValue != nullptr)
106*8975f5c5SAndroid Build Coastguard Worker {
107*8975f5c5SAndroid Build Coastguard Worker std::memcpy(value, copyValue, copySize);
108*8975f5c5SAndroid Build Coastguard Worker }
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker if (valueSizeRet != nullptr)
111*8975f5c5SAndroid Build Coastguard Worker {
112*8975f5c5SAndroid Build Coastguard Worker *valueSizeRet = copySize;
113*8975f5c5SAndroid Build Coastguard Worker }
114*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Continue;
115*8975f5c5SAndroid Build Coastguard Worker }
116*8975f5c5SAndroid Build Coastguard Worker
117*8975f5c5SAndroid Build Coastguard Worker Image::~Image() = default;
118*8975f5c5SAndroid Build Coastguard Worker
isRegionValid(const cl::MemOffsets & origin,const cl::Coordinate & region) const119*8975f5c5SAndroid Build Coastguard Worker bool Image::isRegionValid(const cl::MemOffsets &origin, const cl::Coordinate ®ion) const
120*8975f5c5SAndroid Build Coastguard Worker {
121*8975f5c5SAndroid Build Coastguard Worker switch (getType())
122*8975f5c5SAndroid Build Coastguard Worker {
123*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image1D:
124*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image1D_Buffer:
125*8975f5c5SAndroid Build Coastguard Worker return origin.x + region.x <= mDesc.width;
126*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image2D:
127*8975f5c5SAndroid Build Coastguard Worker return origin.x + region.x <= mDesc.width && origin.y + region.y <= mDesc.height;
128*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image3D:
129*8975f5c5SAndroid Build Coastguard Worker return origin.x + region.x <= mDesc.width && origin.y + region.y <= mDesc.height &&
130*8975f5c5SAndroid Build Coastguard Worker origin.z + region.z <= mDesc.depth;
131*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image1D_Array:
132*8975f5c5SAndroid Build Coastguard Worker return origin.x + region.x <= mDesc.width && origin.y + region.y <= mDesc.arraySize;
133*8975f5c5SAndroid Build Coastguard Worker case MemObjectType::Image2D_Array:
134*8975f5c5SAndroid Build Coastguard Worker return origin.x + region.x <= mDesc.width && origin.y + region.y <= mDesc.height &&
135*8975f5c5SAndroid Build Coastguard Worker origin.z + region.z <= mDesc.arraySize;
136*8975f5c5SAndroid Build Coastguard Worker default:
137*8975f5c5SAndroid Build Coastguard Worker ASSERT(false);
138*8975f5c5SAndroid Build Coastguard Worker break;
139*8975f5c5SAndroid Build Coastguard Worker }
140*8975f5c5SAndroid Build Coastguard Worker return false;
141*8975f5c5SAndroid Build Coastguard Worker }
142*8975f5c5SAndroid Build Coastguard Worker
Image(Context & context,PropArray && properties,MemFlags flags,const cl_image_format & format,const ImageDescriptor & desc,Memory * parent,void * hostPtr)143*8975f5c5SAndroid Build Coastguard Worker Image::Image(Context &context,
144*8975f5c5SAndroid Build Coastguard Worker PropArray &&properties,
145*8975f5c5SAndroid Build Coastguard Worker MemFlags flags,
146*8975f5c5SAndroid Build Coastguard Worker const cl_image_format &format,
147*8975f5c5SAndroid Build Coastguard Worker const ImageDescriptor &desc,
148*8975f5c5SAndroid Build Coastguard Worker Memory *parent,
149*8975f5c5SAndroid Build Coastguard Worker void *hostPtr)
150*8975f5c5SAndroid Build Coastguard Worker : Memory(context, std::move(properties), flags, parent, hostPtr), mFormat(format), mDesc(desc)
151*8975f5c5SAndroid Build Coastguard Worker {
152*8975f5c5SAndroid Build Coastguard Worker mSize = getSliceSize() * getDepth() * getArraySize();
153*8975f5c5SAndroid Build Coastguard Worker ANGLE_CL_IMPL_TRY(context.getImpl().createImage(*this, hostPtr, &mImpl));
154*8975f5c5SAndroid Build Coastguard Worker }
155*8975f5c5SAndroid Build Coastguard Worker
156*8975f5c5SAndroid Build Coastguard Worker } // namespace cl
157