Edit

kc3-lang/angle/src/libANGLE/CLImage.cpp

Branch :

  • Show log

    Commit

  • Author : John Plate
    Date : 2021-06-11 19:12:11
    Hash : 69562546
    Message : CL: Refactor info structs and fix conformance bug - Remove variable name prefix from Info structs to be more consistent with other ANGLE structs. - Fix CL object validation check with magics, since the Mesa solution doesn't work without RTTI. - Add support for some extensions required by OpenCL 1.1 and for some optional extensions. - Fix more conformance bugs. Bug: angleproject:6015 Change-Id: I41b1c45d95059a9994f5dc78bf9b74476cc6f2d4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2956349 Commit-Queue: John Plate <jplate@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/libANGLE/CLImage.cpp
  • //
    // Copyright 2021 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    // CLImage.cpp: Implements the cl::Image class.
    
    #include "libANGLE/CLImage.h"
    
    #include "libANGLE/cl_utils.h"
    
    #include <cstring>
    
    namespace cl
    {
    
    bool Image::IsTypeValid(MemObjectType imageType)
    {
        switch (imageType)
        {
            case MemObjectType::Image1D:
            case MemObjectType::Image2D:
            case MemObjectType::Image3D:
            case MemObjectType::Image1D_Array:
            case MemObjectType::Image2D_Array:
            case MemObjectType::Image1D_Buffer:
                break;
            default:
                return false;
        }
        return true;
    }
    
    cl_int Image::getInfo(ImageInfo name, size_t valueSize, void *value, size_t *valueSizeRet) const
    {
        size_t valSizeT       = 0u;
        void *valPointer      = nullptr;
        const void *copyValue = nullptr;
        size_t copySize       = 0u;
    
        switch (name)
        {
            case ImageInfo::Format:
                copyValue = &mFormat;
                copySize  = sizeof(mFormat);
                break;
            case ImageInfo::ElementSize:
                valSizeT  = GetElementSize(mFormat);
                copyValue = &valSizeT;
                copySize  = sizeof(valSizeT);
                break;
            case ImageInfo::RowPitch:
                copyValue = &mDesc.rowPitch;
                copySize  = sizeof(mDesc.rowPitch);
                break;
            case ImageInfo::SlicePitch:
                copyValue = &mDesc.slicePitch;
                copySize  = sizeof(mDesc.slicePitch);
                break;
            case ImageInfo::Width:
                copyValue = &mDesc.width;
                copySize  = sizeof(mDesc.width);
                break;
            case ImageInfo::Height:
                copyValue = &mDesc.height;
                copySize  = sizeof(mDesc.height);
                break;
            case ImageInfo::Depth:
                copyValue = &mDesc.depth;
                copySize  = sizeof(mDesc.depth);
                break;
            case ImageInfo::ArraySize:
                copyValue = &mDesc.arraySize;
                copySize  = sizeof(mDesc.arraySize);
                break;
            case ImageInfo::Buffer:
                valPointer = Memory::CastNative(mParent.get());
                copyValue  = &valPointer;
                copySize   = sizeof(valPointer);
                break;
            case ImageInfo::NumMipLevels:
                copyValue = &mDesc.numMipLevels;
                copySize  = sizeof(mDesc.numMipLevels);
                break;
            case ImageInfo::NumSamples:
                copyValue = &mDesc.numSamples;
                copySize  = sizeof(mDesc.numSamples);
                break;
            default:
                return CL_INVALID_VALUE;
        }
    
        if (value != nullptr)
        {
            // CL_INVALID_VALUE if size in bytes specified by param_value_size is < size of return type
            // as described in the Image Object Queries table and param_value is not NULL.
            if (valueSize < copySize)
            {
                return CL_INVALID_VALUE;
            }
            if (copyValue != nullptr)
            {
                std::memcpy(value, copyValue, copySize);
            }
        }
        if (valueSizeRet != nullptr)
        {
            *valueSizeRet = copySize;
        }
        return CL_SUCCESS;
    }
    
    Image::~Image() = default;
    
    bool Image::isRegionValid(const size_t origin[3], const size_t region[3]) const
    {
        switch (getType())
        {
            case MemObjectType::Image1D:
            case MemObjectType::Image1D_Buffer:
                return origin[0] + region[0] <= mDesc.width;
            case MemObjectType::Image2D:
                return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.height;
            case MemObjectType::Image3D:
                return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.height &&
                       origin[2] + region[2] <= mDesc.depth;
            case MemObjectType::Image1D_Array:
                return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.arraySize;
            case MemObjectType::Image2D_Array:
                return origin[0] + region[0] <= mDesc.width && origin[1] + region[1] <= mDesc.height &&
                       origin[2] + region[2] <= mDesc.arraySize;
            default:
                ASSERT(false);
                break;
        }
        return false;
    }
    
    Image::Image(Context &context,
                 PropArray &&properties,
                 MemFlags flags,
                 const cl_image_format &format,
                 const ImageDescriptor &desc,
                 Memory *parent,
                 void *hostPtr,
                 cl_int &errorCode)
        : Memory(*this,
                 context,
                 std::move(properties),
                 flags,
                 format,
                 desc,
                 parent,
                 hostPtr,
                 errorCode),
          mFormat(format),
          mDesc(desc)
    {}
    
    }  // namespace cl