• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &region) 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