• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2018-2020 Arm Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #ifndef ARM_COMPUTE_RUNTIME_GLES_COMPUTE_GC_MEMORY_REGION_H
25 #define ARM_COMPUTE_RUNTIME_GLES_COMPUTE_GC_MEMORY_REGION_H
26 
27 #include "arm_compute/core/GLES_COMPUTE/OpenGLES.h"
28 #include "arm_compute/runtime/IMemoryRegion.h"
29 
30 #include <cstddef>
31 
32 namespace arm_compute
33 {
34 /** GLES memory region interface */
35 class IGCMemoryRegion : public IMemoryRegion
36 {
37 public:
38     /** Constructor
39      *
40      * @param[in] size Region size
41      */
42     IGCMemoryRegion(size_t size);
43     /** Default Destructor */
44     virtual ~IGCMemoryRegion() = default;
45     /** Prevent instances of this class from being copied (As this class contains pointers) */
46     IGCMemoryRegion(const IGCMemoryRegion &) = delete;
47     /** Default move constructor */
48     IGCMemoryRegion(IGCMemoryRegion &&) = default;
49     /** Prevent instances of this class from being copied (As this class contains pointers) */
50     IGCMemoryRegion &operator=(const IGCMemoryRegion &) = delete;
51     /** Default move assignment operator */
52     IGCMemoryRegion &operator=(IGCMemoryRegion &&) = default;
53     /** Returns the underlying CL buffer
54      *
55      * @return CL memory buffer object
56      */
57     const GLuint &gc_ssbo_name() const;
58     /** Host/SVM pointer accessor
59      *
60      * @return Host/SVM pointer base
61      */
62     virtual void *ptr() = 0;
63     /** Enqueue a map operation of the allocated buffer on the given queue.
64      *
65      * @param[in] blocking If true, then the mapping will be ready to use by the time
66      *                     this method returns, else it is the caller's responsibility
67      *                     to flush the queue and wait for the mapping operation to have completed before using the returned mapping pointer.
68      *
69      * @return The mapping address.
70      */
71     virtual void *map(bool blocking) = 0;
72     /** Enqueue an unmap operation of the allocated buffer on the given queue.
73      *
74      * @note This method simply enqueue the unmap operation, it is the caller's responsibility to flush the queue and make sure the unmap is finished before
75      *       the memory is accessed by the device.
76      *
77      */
78     virtual void unmap() = 0;
79 
80     // Inherited methods overridden :
81     void       *buffer() override;
82     const void *buffer() const override;
83 
84 protected:
85     void *_mapping;
86     GLuint _ssbo_name;
87 };
88 
89 /** GLES buffer memory region implementation */
90 class GCBufferMemoryRegion final : public IGCMemoryRegion
91 {
92 public:
93     /** Constructor
94      *
95      * @param[in] size Region size
96      */
97     GCBufferMemoryRegion(size_t size);
98     /** Destructor */
99     ~GCBufferMemoryRegion();
100 
101     // Inherited methods overridden :
102     void *ptr() final;
103     void *map(bool blocking) final;
104     void                           unmap() final;
105     std::unique_ptr<IMemoryRegion> extract_subregion(size_t offset, size_t size) final;
106 };
107 } // namespace arm_compute
108 #endif /* ARM_COMPUTE_RUNTIME_GLES_COMPUTE_GC_MEMORY_REGION_H */
109