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 ®ion) 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