summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward O'Callaghan <funfunctor@folklore1984.net>2017-02-28 11:04:04 +1100
committerEdward O'Callaghan <funfunctor@folklore1984.net>2017-02-28 11:04:04 +1100
commitdf3bb3446af010268b5621cca9a04184c05964ac (patch)
tree7721e64b078ab4a20b0c2df35fbf513bc0fcaa67
parentf53f6b63d18e1ccdf7107d29e861f60c0ff5c733 (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.h1
-rw-r--r--src/framebuffer.c21
-rw-r--r--src/gl_minimal.c44
-rw-r--r--src/main.c2
-rw-r--r--src/modesetting.c2
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");
+ }
}
diff --git a/src/main.c b/src/main.c
index 289381c..a6b36f1 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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;
}