| // |
| // 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. |
| // |
| // CLContextCL.h: Defines the class interface for CLContextCL, implementing CLContextImpl. |
| |
| #ifndef LIBANGLE_RENDERER_CL_CLCONTEXTCL_H_ |
| #define LIBANGLE_RENDERER_CL_CLCONTEXTCL_H_ |
| |
| #include "libANGLE/renderer/cl/cl_types.h" |
| |
| #include "libANGLE/renderer/CLContextImpl.h" |
| |
| #include "common/Spinlock.h" |
| #include "common/SynchronizedValue.h" |
| |
| #include <unordered_set> |
| |
| namespace rx |
| { |
| |
| class CLContextCL : public CLContextImpl |
| { |
| public: |
| CLContextCL(const cl::Context &context, cl_context native); |
| ~CLContextCL() override; |
| |
| bool hasMemory(cl_mem memory) const; |
| bool hasSampler(cl_sampler sampler) const; |
| bool hasDeviceQueue(cl_command_queue queue) const; |
| |
| cl::DevicePtrs getDevices(cl_int &errorCode) const override; |
| |
| CLCommandQueueImpl::Ptr createCommandQueue(const cl::CommandQueue &commandQueue, |
| cl_int &errorCode) override; |
| |
| CLMemoryImpl::Ptr createBuffer(const cl::Buffer &buffer, |
| size_t size, |
| void *hostPtr, |
| cl_int &errorCode) override; |
| |
| CLMemoryImpl::Ptr createImage(const cl::Image &image, |
| cl::MemFlags flags, |
| const cl_image_format &format, |
| const cl::ImageDescriptor &desc, |
| void *hostPtr, |
| cl_int &errorCode) override; |
| |
| cl_int getSupportedImageFormats(cl::MemFlags flags, |
| cl::MemObjectType imageType, |
| cl_uint numEntries, |
| cl_image_format *imageFormats, |
| cl_uint *numImageFormats) override; |
| |
| CLSamplerImpl::Ptr createSampler(const cl::Sampler &sampler, cl_int &errorCode) override; |
| |
| CLProgramImpl::Ptr createProgramWithSource(const cl::Program &program, |
| const std::string &source, |
| cl_int &errorCode) override; |
| |
| CLProgramImpl::Ptr createProgramWithIL(const cl::Program &program, |
| const void *il, |
| size_t length, |
| cl_int &errorCode) override; |
| |
| CLProgramImpl::Ptr createProgramWithBinary(const cl::Program &program, |
| const size_t *lengths, |
| const unsigned char **binaries, |
| cl_int *binaryStatus, |
| cl_int &errorCode) override; |
| |
| CLProgramImpl::Ptr createProgramWithBuiltInKernels(const cl::Program &program, |
| const char *kernel_names, |
| cl_int &errorCode) override; |
| |
| CLProgramImpl::Ptr linkProgram(const cl::Program &program, |
| const cl::DevicePtrs &devices, |
| const char *options, |
| const cl::ProgramPtrs &inputPrograms, |
| cl::Program *notify, |
| cl_int &errorCode) override; |
| |
| CLEventImpl::Ptr createUserEvent(const cl::Event &event, cl_int &errorCode) override; |
| |
| cl_int waitForEvents(const cl::EventPtrs &events) override; |
| |
| private: |
| struct Mutable |
| { |
| std::unordered_set<const _cl_mem *> mMemories; |
| std::unordered_set<const _cl_sampler *> mSamplers; |
| std::unordered_set<const _cl_command_queue *> mDeviceQueues; |
| }; |
| using MutableData = angle::SynchronizedValue<Mutable, angle::Spinlock>; |
| |
| const cl_context mNative; |
| MutableData mData; |
| |
| friend class CLCommandQueueCL; |
| friend class CLMemoryCL; |
| friend class CLSamplerCL; |
| }; |
| |
| inline bool CLContextCL::hasMemory(cl_mem memory) const |
| { |
| const auto data = mData.synchronize(); |
| return data->mMemories.find(memory) != data->mMemories.cend(); |
| } |
| |
| inline bool CLContextCL::hasSampler(cl_sampler sampler) const |
| { |
| const auto data = mData.synchronize(); |
| return data->mSamplers.find(sampler) != data->mSamplers.cend(); |
| } |
| |
| inline bool CLContextCL::hasDeviceQueue(cl_command_queue queue) const |
| { |
| const auto data = mData.synchronize(); |
| return data->mDeviceQueues.find(queue) != data->mDeviceQueues.cend(); |
| } |
| |
| } // namespace rx |
| |
| #endif // LIBANGLE_RENDERER_CL_CLCONTEXTCL_H_ |