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