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