xref: /aosp_15_r20/external/angle/src/libANGLE/CLImage.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 // 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 &region) 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