void* generate_package(uint8 pdu_type, uint32 content_len, uint16 seq) { uint32 data_len = TOTAL_HEADER_LEN + content_len; void* buf = malloc(data_len); CHECK(buf != NULL); memset(buf, 0, data_len); fill_link_header((uint8*)buf, pdu_type, content_len, seq); if(pdu_type == PDU_DATA) { fill_content(buf, content_len); } return buf; }
static int create_dmabuf_buffer(struct display *display, struct buffer *buffer, int width, int height) { struct zwp_linux_buffer_params_v1 *params; uint64_t modifier; uint32_t flags; if (!drm_connect(buffer)) { fprintf(stderr, "drm_connect failed\n"); goto error; } buffer->width = width; buffer->height = height; buffer->bpp = 32; /* hardcoded XRGB8888 format */ if (!alloc_bo(buffer)) { fprintf(stderr, "alloc_bo failed\n"); goto error1; } if (!map_bo(buffer)) { fprintf(stderr, "map_bo failed\n"); goto error2; } fill_content(buffer); unmap_bo(buffer); if (drm_intel_bo_gem_export_to_prime(buffer->bo, &buffer->dmabuf_fd) != 0) { fprintf(stderr, "drm_intel_bo_gem_export_to_prime failed\n"); goto error2; } if (buffer->dmabuf_fd < 0) { fprintf(stderr, "error: dmabuf_fd < 0\n"); goto error2; } /* We now have a dmabuf! It should contain 2x2 tiles (i.e. each tile * is 256x256) of misc colours, and be mappable, either as ARGB8888, or * XRGB8888. */ modifier = 0; flags = 0; params = zwp_linux_dmabuf_v1_create_params(display->dmabuf); zwp_linux_buffer_params_v1_add(params, buffer->dmabuf_fd, 0, /* plane_idx */ 0, /* offset */ buffer->stride, modifier >> 32, modifier & 0xffffffff); zwp_linux_buffer_params_v1_add_listener(params, ¶ms_listener, buffer); zwp_linux_buffer_params_v1_create(params, buffer->width, buffer->height, DRM_FORMAT_XRGB8888, flags); return 0; error2: free_bo(buffer); error1: drm_shutdown(buffer); error: return -1; }