CVB++ 15.0
detail_opengl_image_renderer_factory.hpp
1#pragma once
2
3#include <stdexcept>
4#include <sstream>
5
6#include "../../global.hpp"
7
8#include "../_decl/decl_opengl_image_renderer_factory.hpp"
9
10namespace Cvb
11{
12
13 CVB_BEGIN_INLINE_NS
14
15 namespace UI
16 {
17
19 {
20 switch (version)
21 {
22 default:
23 throw std::runtime_error("unsupported render engine - check your system");
24
25 case 2:
26 return std::make_unique<GL2ImageRenderer>();
27
28#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)
29 case 3:
30 return std::make_unique<GL3ImageRenderer>();
31#endif
32 }
33 }
34
35 inline QSurfaceFormat OpenGLImageRendererFactory::CreateFormat(int version)
36 {
37 QSurfaceFormat format;
38 if (TryVersion(version, format))
39 return format;
40
41 std::stringstream stream;
42 stream << "failed to create format for OpenGL " << version;
43
44 throw std::runtime_error(stream.str().c_str());
45 }
46
47 inline bool OpenGLImageRendererFactory::TryVersion(int version) noexcept
48 {
49 QSurfaceFormat format;
50 return TryVersion(version, format);
51 }
52
53 inline bool OpenGLImageRendererFactory::TryVersion(int version, QSurfaceFormat &format) noexcept
54 {
55 QSurfaceFormat formatA;
56 // compatible format for raster engine if qt version is < 5.8.x
57 formatA.setProfile(QSurfaceFormat::CompatibilityProfile);
58 if (TryFormat(formatA, version))
59 {
60 format = formatA;
61 return true;
62 }
63
64 QSurfaceFormat formatB;
65 if (TryFormat(formatB, version))
66 {
67 format = formatB;
68 return true;
69 }
70
71 QSurfaceFormat formatC;
72 formatC.setVersion(version, 0);
73 if (TryFormat(formatC, version))
74 {
75 format = formatC;
76 return true;
77 }
78
79 return false;
80 }
81
83 {
84 return ReadString(version, GL_VENDOR);
85 }
86
88 {
89 return ReadString(version, GL_RENDERER);
90 }
91
92#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)
93 inline OpenGLImageRendererFactory::GL3ImageRenderer::GL3ImageRenderer() noexcept
95 {
96 }
97
98 inline void
99 OpenGLImageRendererFactory::GL3ImageRenderer::UpdateBufferFormat(const OpenGLBufferFormat &bufferFormat) noexcept
100 {
101 SetBufferFormat(bufferFormat);
102
103 BindTexture();
104 Image2DTexture(bufferFormat, nullptr, true);
105 ReleaseTexture();
106
107 auto size = bufferFormat.Height * (bufferFormat.Width + bufferFormat.LinePad);
108
109 pixelBuffer_.Bind();
110 pixelBuffer_.Data(size << ((bufferFormat.TextureFormat == OpenGLTextureFormat::Mono) ? 0 : 2));
111 pixelBuffer_.Release();
112 }
113
114 inline OpenGLImageRendererFactory::GL3ImageRenderer::GLPixelBuffer::GLPixelBuffer() noexcept
115 {
116 initializeOpenGLFunctions();
117 glGenBuffers(1, &handle_);
118 }
119
120 inline OpenGLImageRendererFactory::GL3ImageRenderer::GLPixelBuffer::~GLPixelBuffer()
121 {
122 glDeleteBuffers(1, &handle_);
123 }
124
125 inline void OpenGLImageRendererFactory::GL3ImageRenderer::GLPixelBuffer::Bind() noexcept
126 {
127 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, handle_);
128 }
129
130 inline void OpenGLImageRendererFactory::GL3ImageRenderer::GLPixelBuffer::Release() noexcept
131 {
132 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
133 }
134
135 inline void OpenGLImageRendererFactory::GL3ImageRenderer::GLPixelBuffer::Data() noexcept
136 {
137 glBufferData(GL_PIXEL_UNPACK_BUFFER, static_cast<qopengl_GLsizeiptr>(size_), 0, GL_STREAM_DRAW);
138 }
139
140 inline void OpenGLImageRendererFactory::GL3ImageRenderer::GLPixelBuffer::Data(int size) noexcept
141 {
142 size_ = size;
143 glBufferData(GL_PIXEL_UNPACK_BUFFER, static_cast<qopengl_GLsizeiptr>(size_), 0, GL_STREAM_DRAW);
144 }
145
146 inline void *OpenGLImageRendererFactory::GL3ImageRenderer::GLPixelBuffer::Map() noexcept
147 {
148
149 return glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, static_cast<GLsizeiptr>(size_), GL_MAP_WRITE_BIT);
150 }
151
152 inline void OpenGLImageRendererFactory::GL3ImageRenderer::GLPixelBuffer::Unmap() noexcept
153 {
154 glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
155 }
156#endif
157
158 inline void
159 OpenGLImageRendererFactory::GL2ImageRenderer::UpdateBufferFormat(const OpenGLBufferFormat &bufferFormat) noexcept
160 {
161 SetBufferFormat(bufferFormat);
162 auto size = bufferFormat.Height * (bufferFormat.Width);
163 std::vector<std::uint8_t>(size << 2).swap(pixelBuffer_);
164 }
165
166 } // namespace UI
167
168 CVB_END_INLINE_NS
169
170} // namespace Cvb
static QSurfaceFormat CreateFormat(int version)
Create a OpenGL format for the given version.
Definition detail_opengl_image_renderer_factory.hpp:35
static String VendorName(int version)
Get the name of the OpenGL vendor.
Definition detail_opengl_image_renderer_factory.hpp:82
static bool TryVersion(int version) noexcept
Test if a OpenGL version is implemented on your system.
Definition detail_opengl_image_renderer_factory.hpp:47
static String RendererName(int version)
Gets the name of the OpenGL renderer.
Definition detail_opengl_image_renderer_factory.hpp:87
static std::unique_ptr< OpenGLImageRenderer > CreateRenderer(int version)
Create a renderer.
Definition detail_opengl_image_renderer_factory.hpp:18
Base class for OpenGL image renderer.
Definition decl_opengl_image_renderer.hpp:43
Namespace for user interface components.
Definition decl_image_scene.hpp:39
@ Mono
Definition ui.hpp:144
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17
std::string String
String for wide characters or unicode characters.
Definition string.hpp:49