diff options
author | Edward O'Callaghan <funfunctor@folklore1984.net> | 2017-02-28 11:04:04 +1100 |
---|---|---|
committer | Edward O'Callaghan <funfunctor@folklore1984.net> | 2017-02-28 11:04:04 +1100 |
commit | df3bb3446af010268b5621cca9a04184c05964ac (patch) | |
tree | 7721e64b078ab4a20b0c2df35fbf513bc0fcaa67 | |
parent | f53f6b63d18e1ccdf7107d29e861f60c0ff5c733 (diff) |
src/: Refactor to not use gbm bo explicitly.
There are two ways to do rendering, with:
* gbm_bo_create + eglCreateImageKHR -> gl rendererbuffer (doable, but not what most users do), or
* gbm_surface_create + EGLSurface -> egl surface rendering + gbm_surface_lock_front_buffer + eglCreateImageKHR
We were confused before doing both opposing mechanisms and so,
we pick the latter here of 'gbm_surface+EGLSurface+eglSwapBuffers'.
Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
-rw-r--r-- | src/common.h | 1 | ||||
-rw-r--r-- | src/framebuffer.c | 21 | ||||
-rw-r--r-- | src/gl_minimal.c | 44 | ||||
-rw-r--r-- | src/main.c | 2 | ||||
-rw-r--r-- | src/modesetting.c | 2 |
5 files changed, 23 insertions, 47 deletions
diff --git a/src/common.h b/src/common.h index 7f3ecf2..6c168f1 100644 --- a/src/common.h +++ b/src/common.h @@ -27,7 +27,6 @@ struct drm_fb { uint32_t handle; /** a DRM handle to the buffer object that we can draw into */ /* Used by gbm fbs */ - struct gbm_bo *bo; struct gbm_device *gbm_dev; struct gbm_surface *gbm_surface; /* Used by dumb fbs */ diff --git a/src/framebuffer.c b/src/framebuffer.c index 870a67f..15bf685 100644 --- a/src/framebuffer.c +++ b/src/framebuffer.c @@ -113,7 +113,6 @@ static int modeset_create_gbm_fb(struct drm_fb *dev, int fd) int format = GBM_FORMAT_XRGB8888; uint32_t bpp = 32, depth = 24; - struct gbm_bo * bo; int ret; struct gbm_device * gbm_dev = gbm_create_device(fd); @@ -124,25 +123,6 @@ static int modeset_create_gbm_fb(struct drm_fb *dev, int fd) } dev->gbm_dev = gbm_dev; - bo = gbm_bo_create(gbm_dev, dev->width, dev->height, format, flags); - assert(bo); - - /* create framebuffer object for the dumb-buffer */ - ret = drmModeAddFB(fd, - gbm_bo_get_width(bo), - gbm_bo_get_height(bo), - depth, bpp, - gbm_bo_get_stride(bo), - gbm_bo_get_handle(bo).u32, - &dev->fb); - if (ret) { - fprintf(stderr, "cannot create framebuffer (%d): %m\n", errno); - gbm_bo_destroy(bo); - return -errno; - } - - dev->bo = bo; - dev->gbm_surface = gbm_surface_create(gbm_dev, dev->width, dev->height, format, flags); if (!dev->gbm_surface) { fprintf(stderr, "failed to create gbm surface\n"); @@ -155,7 +135,6 @@ static int modeset_create_gbm_fb(struct drm_fb *dev, int fd) static int modeset_cleanup_gbm_fb(struct drm_fb *dev, int fd) { - gbm_bo_destroy(dev->bo); gbm_surface_destroy(dev->gbm_surface); gbm_device_destroy(dev->gbm_dev); drmModeRmFB(fd, dev->fb); diff --git a/src/gl_minimal.c b/src/gl_minimal.c index 9afc01f..b5d29df 100644 --- a/src/gl_minimal.c +++ b/src/gl_minimal.c @@ -10,26 +10,7 @@ void run_gl_example(struct display * d) { - EGLImageKHR image; - GLuint fb, color_rb, depth_rb; - - glGenFramebuffers(1, &fb); - glBindFramebuffer(GL_FRAMEBUFFER_EXT, fb); - - image = eglCreateImageKHR(d->egl.display, NULL, EGL_NATIVE_PIXMAP_KHR, d->dev->bo, NULL); - - /* Set up render buffer... */ - glGenRenderbuffers(1, &color_rb); - glBindRenderbuffer(GL_RENDERBUFFER_EXT, color_rb); - glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER, image); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, color_rb); - - /* and depth buffer */ - glGenRenderbuffers(1, &depth_rb); - glBindRenderbuffer(GL_RENDERBUFFER_EXT, depth_rb); - glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, d->dev->width, d->dev->height); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb); - +#if 0 // wipe the drawing surface clear for (unsigned i = 0; i < 3; i++) { GLfloat r =0.0,g = 0.0,b = 0.0; @@ -42,6 +23,7 @@ void run_gl_example(struct display * d) glFlush(); sleep(3); } +#endif const GLfloat vertices[] = { 0.0f, 0.5f, 0.0f, @@ -117,10 +99,26 @@ void run_gl_example(struct display * d) glDrawArrays(GL_TRIANGLES, 0, 3); glBindVertexArray(0); - glFlush(); - sleep(3); - glDeleteVertexArrays(1, &vao); glDeleteBuffers(1, &vbo); + eglSwapBuffers(d->egl.display, d->egl.surface); + + /* this must be _after_ calling eglSwapBuffers */ + struct gbm_bo * bo; + bo = gbm_surface_lock_front_buffer(d->dev->gbm_surface); + assert(bo); + + uint32_t bpp = 32, depth = 24; + /* create framebuffer object for the gbm bo extracted from the gbm surf */ + int ret = drmModeAddFB(d->rnode.fd, + gbm_bo_get_width(bo), + gbm_bo_get_height(bo), + depth, bpp, + gbm_bo_get_stride(bo), + gbm_bo_get_handle(bo).u32, + &d->dev->fb); + if (ret) { + fprintf(stderr, "cannot create framebuffer\n"); + } } @@ -85,6 +85,8 @@ int main() /* draw here?? */ run_gl_example(&d); /* ...... */ + modeset_crtc(d.rnode.fd); + sleep(3); // XXX keep rendered scene on screen for a bit /* cleanups */ diff --git a/src/modesetting.c b/src/modesetting.c index c454083..7860a25 100644 --- a/src/modesetting.c +++ b/src/modesetting.c @@ -205,8 +205,6 @@ int modeset(struct display * d) drmModeFreeResources(res); - modeset_crtc(fd); - return 0; } |