20
20
#include < GLES3/gl3.h>
21
21
#include < GLES3/gl3ext.h>
22
22
23
+ #include " result.h"
23
24
#include " texture.h"
24
25
25
26
namespace libcamera {
@@ -37,6 +38,42 @@ float rectangleVertices[] = {
37
38
-1 .0f , 1 .0f , 0 .0f , 1 .0f
38
39
};
39
40
41
+ std::string eglStrError (EGLint error)
42
+ {
43
+ printf (" Error: %d\n " , error);
44
+
45
+ switch (error) {
46
+ case EGL_SUCCESS:
47
+ return " EGL_SUCCESS" ;
48
+ case EGL_BAD_ALLOC:
49
+ return " EGL_BAD_ALLOC" ;
50
+ case EGL_BAD_CONFIG:
51
+ return " EGL_BAD_CONFIG" ;
52
+ case EGL_BAD_PARAMETER:
53
+ return " EGL_BAD_PARAMETER" ;
54
+ case EGL_BAD_MATCH:
55
+ return " EGL_BAD_MATCH" ;
56
+ case EGL_BAD_ATTRIBUTE:
57
+ return " EGL_BAD_ATTRIBUTE" ;
58
+ case EGL_BAD_CONTEXT:
59
+ return " EGL_BAD_CONTEXT" ;
60
+ case EGL_BAD_CURRENT_SURFACE:
61
+ return " EGL_BAD_CURRENT_SURFACE" ;
62
+ case EGL_BAD_DISPLAY:
63
+ return " EGL_BAD_DISPLAY" ;
64
+ case EGL_BAD_SURFACE:
65
+ return " EGL_BAD_SURFACE" ;
66
+ case EGL_BAD_NATIVE_PIXMAP:
67
+ return " EGL_BAD_NATIVE_PIXMAP" ;
68
+ case EGL_BAD_NATIVE_WINDOW:
69
+ return " EGL_BAD_NATIVE_WINDOW" ;
70
+ case EGL_CONTEXT_LOST:
71
+ return " EGL_CONTEXT_LOST" ;
72
+ default :
73
+ return " UNKNOWN" ;
74
+ }
75
+ }
76
+
40
77
int SimpleConverter::configure (const StreamConfiguration &inputCfg,
41
78
const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs)
42
79
{
@@ -112,7 +149,7 @@ std::pair<std::unique_ptr<FrameBuffer>, GlRenderTarget> SimpleConverter::createB
112
149
{
113
150
LOG (SimplePipeline, Debug) << " CREATE BUFFERS CALLED" ;
114
151
bo_ = gbm_bo_create (gbm_, outformat_.size .width , outformat_.size .height ,
115
- GBM_BO_FORMAT_ARGB8888, GBM_BO_USE_RENDERING);
152
+ GBM_BO_FORMAT_ARGB8888, GBM_BO_USE_LINEAR | GBM_BO_USE_RENDERING);
116
153
if (!bo_)
117
154
LOG (SimplePipeline, Error) << " GBM buffer not created " ;
118
155
@@ -172,6 +209,10 @@ SimpleConverter::DmabufImage SimpleConverter::importDmabuf(int fdesc, Size pixel
172
209
NULL ,
173
210
attrs);
174
211
212
+ if (image == EGL_NO_IMAGE_KHR) {
213
+ LOG (SimplePipeline, Error) << " XXXXXXXXXXXXXXXXXXXXXXXX" ;
214
+ }
215
+
175
216
int e = glGetError ();
176
217
177
218
if (e != GL_NO_ERROR)
@@ -183,6 +224,9 @@ SimpleConverter::DmabufImage SimpleConverter::importDmabuf(int fdesc, Size pixel
183
224
.texture = texture,
184
225
.image = image,
185
226
};
227
+ glBindTexture (GL_TEXTURE_2D, texture);
228
+ auto glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)eglGetProcAddress (" glEGLImageTargetTexture2DOES" );
229
+ glEGLImageTargetTexture2DOES (GL_TEXTURE_2D, image);
186
230
187
231
return img;
188
232
}
@@ -216,11 +260,11 @@ int SimpleConverter::start()
216
260
auto c = eglChooseConfig (display_, attribute_list_config, configs, 32 , &num_config);
217
261
if (c != EGL_TRUE) {
218
262
EGLint err = eglGetError ();
219
- LOG (SimplePipeline, Error) << " <<< config failed: " << err;
263
+ LOG (SimplePipeline, Error) << " <<< config failed: " << err << " \t " << eglStrError (err) ;
220
264
return -1 ;
221
265
}
222
266
if (num_config == 0 ) {
223
- LOG (SimplePipeline, Error) << " <<< found no configs " << std::endl ;
267
+ LOG (SimplePipeline, Error) << " <<< found no configs " ;
224
268
return -1 ;
225
269
}
226
270
@@ -316,10 +360,6 @@ int SimpleConverter::queueBufferGL(FrameBuffer *input, FrameBuffer *output)
316
360
{
317
361
LOG (SimplePipeline, Debug) << " QUEUEBUFFERS GL CALLED" ;
318
362
319
- /* Specify the color of the background */
320
- glClearColor (0 .0f , 1 .0f , 0 .0f , 1 .0f );
321
- glClear (GL_COLOR_BUFFER_BIT);
322
-
323
363
/* Generate texture from input buffer (with raw data) and bind it to GL_TEXTURE_2D */
324
364
325
365
DmabufImage rend_texIn = importDmabuf (input->planes ()[0 ].fd .get (), informat_.size , libcamera::formats::R8);
@@ -335,10 +375,14 @@ int SimpleConverter::queueBufferGL(FrameBuffer *input, FrameBuffer *output)
335
375
glBindTexture (GL_TEXTURE_2D, rend_texOut.texture );
336
376
glEGLImageTargetTexture2DOES (GL_TEXTURE_2D, rend_texOut.image );
337
377
338
- /* Texture constructor call: Assigns textureID and texture type to be used globally within texture class */
339
- Texture bayer (GL_TEXTURE_2D, rend_texOut.texture );
340
- /* Configures texture and binds GL_TEXTURE_2D to GL_FRAMEBUFFER */
341
- bayer.startTexture ();
378
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
379
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
380
+
381
+ /* Prevents edge bleeding */
382
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
383
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
384
+
385
+ glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, rend_texOut.texture , 0 );
342
386
343
387
/* Bind the custom framebuffer */
344
388
glBindFramebuffer (GL_FRAMEBUFFER, fbo_);
@@ -354,13 +398,17 @@ int SimpleConverter::queueBufferGL(FrameBuffer *input, FrameBuffer *output)
354
398
inputBufferReady.emit (input);
355
399
outputBufferReady.emit (output);
356
400
401
+ /* Specify the color of the background */
402
+ glClearColor (0 .0f , 1 .0f , 0 .0f , 1 .0f );
403
+ glClear (GL_COLOR_BUFFER_BIT);
404
+
357
405
return 0 ;
358
406
}
359
407
360
408
void SimpleConverter::stop ()
361
409
{
362
410
LOG (SimplePipeline, Debug) << " STOP CALLED" ;
363
-
411
+
364
412
/* Delete all the objects we've created */
365
413
366
414
framebufferProgram_.deleteProgram ();
0 commit comments