aboutsummaryrefslogtreecommitdiff
path: root/src/wld/dumb.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wld/dumb.c')
-rw-r--r--src/wld/dumb.c272
1 files changed, 148 insertions, 124 deletions
diff --git a/src/wld/dumb.c b/src/wld/dumb.c
index 3ae8d8c..b08d098 100644
--- a/src/wld/dumb.c
+++ b/src/wld/dumb.c
@@ -21,191 +21,215 @@
* SOFTWARE.
*/
-#include "wld/drm-private.h"
-#include "wld/drm.h"
-#include "wld/pixman.h"
+#include "drm-private.h"
+#include "drm.h"
+#include "pixman.h"
#include <fcntl.h>
-#include <sys/mman.h>
#include <unistd.h>
+#include <sys/mman.h>
#include <xf86drm.h>
#include <errno.h>
-struct dumb_context {
- struct wld_context base;
- int fd;
+struct dumb_context
+{
+ struct wld_context base;
+ int fd;
};
-struct dumb_buffer {
- struct buffer base;
- struct wld_exporter exporter;
- struct dumb_context *context;
- uint32_t handle;
+struct dumb_buffer
+{
+ struct buffer base;
+ struct wld_exporter exporter;
+ struct dumb_context * context;
+ uint32_t handle;
};
-#include "interface/buffer.h"
#include "interface/context.h"
+#include "interface/buffer.h"
#define DRM_DRIVER_NAME dumb
#include "interface/drm.h"
IMPL(dumb_context, wld_context)
IMPL(dumb_buffer, wld_buffer)
-const struct wld_context_impl *dumb_context_impl = &wld_context_impl;
+const struct wld_context_impl * dumb_context_impl = &wld_context_impl;
-bool driver_device_supported(uint32_t vendor_id, uint32_t device_id) {
- return true;
+bool driver_device_supported(uint32_t vendor_id, uint32_t device_id)
+{
+ return true;
}
-struct wld_context *driver_create_context(int drm_fd) {
- struct dumb_context *context;
+struct wld_context * driver_create_context(int drm_fd)
+{
+ struct dumb_context * context;
- if (!(context = malloc(sizeof *context)))
- return NULL;
+ if (!(context = malloc(sizeof *context)))
+ return NULL;
- context_initialize(&context->base, &wld_context_impl);
- context->fd = drm_fd;
+ context_initialize(&context->base, &wld_context_impl);
+ context->fd = drm_fd;
- return &context->base;
+ return &context->base;
}
-struct wld_renderer *context_create_renderer(struct wld_context *context) {
- return wld_create_renderer(wld_pixman_context);
+struct wld_renderer * context_create_renderer(struct wld_context * context)
+{
+ return wld_create_renderer(wld_pixman_context);
}
-static bool export(struct wld_exporter *exporter, struct wld_buffer *base,
- uint32_t type, union wld_object *object) {
- struct dumb_buffer *buffer = dumb_buffer(base);
-
- switch (type) {
- case WLD_DRM_OBJECT_HANDLE:
- object->u32 = buffer->handle;
- return true;
- case WLD_DRM_OBJECT_PRIME_FD:
- if (drmPrimeHandleToFD(buffer->context->fd, buffer->handle, DRM_CLOEXEC,
- &object->i) != 0) {
- return false;
+static bool export(struct wld_exporter * exporter, struct wld_buffer * base,
+ uint32_t type, union wld_object * object)
+{
+ struct dumb_buffer * buffer = dumb_buffer(base);
+
+ switch (type)
+ {
+ case WLD_DRM_OBJECT_HANDLE:
+ object->u32 = buffer->handle;
+ return true;
+ case WLD_DRM_OBJECT_PRIME_FD:
+ if (drmPrimeHandleToFD(buffer->context->fd, buffer->handle,
+ DRM_CLOEXEC, &object->i) != 0)
+ {
+ return false;
+ }
+
+ return true;
+ default:
+ return false;
}
-
- return true;
- default:
- return false;
- }
}
-static struct buffer *new_buffer(struct dumb_context *context, uint32_t width,
- uint32_t height, uint32_t format,
- uint32_t handle, unsigned long pitch) {
- struct dumb_buffer *buffer;
+static struct buffer * new_buffer(struct dumb_context * context,
+ uint32_t width, uint32_t height,
+ uint32_t format, uint32_t handle,
+ unsigned long pitch)
+{
+ struct dumb_buffer * buffer;
- if (!(buffer = malloc(sizeof *buffer)))
- return NULL;
+ if (!(buffer = malloc(sizeof *buffer)))
+ return NULL;
- buffer_initialize(&buffer->base, &wld_buffer_impl, width, height, format,
- pitch);
- buffer->context = context;
- buffer->handle = handle;
- buffer->exporter.export = &export;
- wld_buffer_add_exporter(&buffer->base.base, &buffer->exporter);
+ buffer_initialize(&buffer->base, &wld_buffer_impl,
+ width, height, format, pitch);
+ buffer->context = context;
+ buffer->handle = handle;
+ buffer->exporter.export = &export;
+ wld_buffer_add_exporter(&buffer->base.base, &buffer->exporter);
- return &buffer->base;
+ return &buffer->base;
}
-struct buffer *context_create_buffer(struct wld_context *base, uint32_t width,
- uint32_t height, uint32_t format,
- uint32_t flags) {
- struct dumb_context *context = dumb_context(base);
- struct buffer *buffer;
- struct drm_mode_create_dumb create_dumb = {
- .height = height,
- .width = width,
- .bpp = format_bytes_per_pixel(format) * 8,
- };
+struct buffer * context_create_buffer(struct wld_context * base,
+ uint32_t width, uint32_t height,
+ uint32_t format, uint32_t flags)
+{
+ struct dumb_context * context = dumb_context(base);
+ struct buffer * buffer;
+ struct drm_mode_create_dumb create_dumb = {
+ .height = height, .width = width,
+ .bpp = format_bytes_per_pixel(format) * 8,
+ };
- if (drmIoctl(context->fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_dumb) != 0)
- goto error0;
+ if (drmIoctl(context->fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_dumb) != 0)
+ goto error0;
- buffer = new_buffer(context, width, height, format, create_dumb.handle,
- create_dumb.pitch);
+ buffer = new_buffer(context, width, height, format,
+ create_dumb.handle, create_dumb.pitch);
- if (!buffer)
- goto error1;
+ if (!buffer)
+ goto error1;
- return buffer;
+ return buffer;
-error1 : {
- struct drm_mode_destroy_dumb destroy_dumb = {.handle = create_dumb.handle};
+ error1:
+ {
+ struct drm_mode_destroy_dumb destroy_dumb = {
+ .handle = create_dumb.handle
+ };
- drmIoctl(context->fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_dumb);
-}
-error0:
- return NULL;
+ drmIoctl(context->fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_dumb);
+ }
+ error0:
+ return NULL;
}
-struct buffer *context_import_buffer(struct wld_context *base, uint32_t type,
- union wld_object object, uint32_t width,
- uint32_t height, uint32_t format,
- uint32_t pitch) {
- struct dumb_context *context = dumb_context(base);
- uint32_t handle;
-
- switch (type) {
- case WLD_DRM_OBJECT_PRIME_FD:
- if (drmPrimeFDToHandle(context->fd, object.i, &handle) != 0)
- return NULL;
- break;
- default:
- return NULL;
- }
+struct buffer * context_import_buffer(struct wld_context * base,
+ uint32_t type, union wld_object object,
+ uint32_t width, uint32_t height,
+ uint32_t format, uint32_t pitch)
+{
+ struct dumb_context * context = dumb_context(base);
+ uint32_t handle;
+
+ switch (type)
+ {
+ case WLD_DRM_OBJECT_PRIME_FD:
+ if (drmPrimeFDToHandle(context->fd, object.i, &handle) != 0)
+ return NULL;
+ break;
+ default: return NULL;
+ }
- return new_buffer(context, width, height, format, handle, pitch);
+ return new_buffer(context, width, height, format, handle, pitch);
}
-void context_destroy(struct wld_context *base) {
- struct dumb_context *context = dumb_context(base);
+void context_destroy(struct wld_context * base)
+{
+ struct dumb_context * context = dumb_context(base);
- close(context->fd);
- free(context);
+ close(context->fd);
+ free(context);
}
/**** Buffer ****/
-bool buffer_map(struct buffer *base) {
- struct dumb_buffer *buffer = dumb_buffer(&base->base);
- struct drm_mode_map_dumb map_dumb = {.handle = buffer->handle};
- void *data;
+bool buffer_map(struct buffer * base)
+{
+ struct dumb_buffer * buffer = dumb_buffer(&base->base);
+ struct drm_mode_map_dumb map_dumb = { .handle = buffer->handle };
+ void * data;
- if (drmIoctl(buffer->context->fd, DRM_IOCTL_MODE_MAP_DUMB, &map_dumb) != 0) {
- return false;
- }
+ if (drmIoctl(buffer->context->fd, DRM_IOCTL_MODE_MAP_DUMB,
+ &map_dumb) != 0)
+ {
+ return false;
+ }
- data = mmap(NULL, buffer->base.base.pitch * buffer->base.base.height,
- PROT_READ | PROT_WRITE, MAP_SHARED, buffer->context->fd,
- map_dumb.offset);
+ data = mmap(NULL, buffer->base.base.pitch * buffer->base.base.height,
+ PROT_READ | PROT_WRITE, MAP_SHARED,
+ buffer->context->fd, map_dumb.offset);
- if (data == MAP_FAILED)
- return false;
+ if (data == MAP_FAILED)
+ return false;
- buffer->base.base.map = data;
+ buffer->base.base.map = data;
- return true;
+ return true;
}
-bool buffer_unmap(struct buffer *buffer) {
- if (munmap(buffer->base.map, buffer->base.pitch * buffer->base.height) ==
- -1) {
- return false;
- }
+bool buffer_unmap(struct buffer * buffer)
+{
+ if (munmap(buffer->base.map,
+ buffer->base.pitch * buffer->base.height) == -1)
+ {
+ return false;
+ }
- buffer->base.map = NULL;
+ buffer->base.map = NULL;
- return true;
+ return true;
}
-void buffer_destroy(struct buffer *base) {
- struct dumb_buffer *buffer = dumb_buffer(&base->base);
- struct drm_mode_destroy_dumb destroy_dumb = {.handle = buffer->handle};
+void buffer_destroy(struct buffer * base)
+{
+ struct dumb_buffer * buffer = dumb_buffer(&base->base);
+ struct drm_mode_destroy_dumb destroy_dumb = {
+ .handle = buffer->handle
+ };
- drmIoctl(buffer->context->fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_dumb);
- free(buffer);
+ drmIoctl(buffer->context->fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_dumb);
+ free(buffer);
}
+