1eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke/* 2eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * Copyright © 2011 Intel Corporation 3eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * 4eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * Permission is hereby granted, free of charge, to any person obtaining a 5eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * copy of this software and associated documentation files (the "Software"), 6eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * to deal in the Software without restriction, including without limitation 7eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * and/or sell copies of the Software, and to permit persons to whom the 9eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * Software is furnished to do so, subject to the following conditions: 10eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * 11eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * The above copyright notice and this permission notice (including the next 12eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * paragraph) shall be included in all copies or substantial portions of the 13eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * Software. 14eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * 15eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * DEALINGS IN THE SOFTWARE. 23eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * 24eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * Authors: 25eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke * Benjamin Franzke <benjaminfranzke@googlemail.com> 26eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke */ 27eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 28eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#define _BSD_SOURCE 29eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 30eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <stddef.h> 31eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <stdio.h> 32eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <stdlib.h> 33eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <string.h> 34eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <stdint.h> 35eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 36eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <sys/types.h> 37eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <sys/stat.h> 38eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include <unistd.h> 39eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 40eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include "gbm.h" 41eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include "gbmint.h" 42eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include "common.h" 43eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#include "backend.h" 44eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 45eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0])) 46eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 47eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkestruct gbm_device *devices[16]; 48eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 49eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkestatic int device_num = 0; 50eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 51baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford/** Returns the file description for the gbm device 52baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 53baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \return The fd that the struct gbm_device was created with 54baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford */ 55eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT int 56eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkegbm_device_get_fd(struct gbm_device *gbm) 57eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{ 58eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return gbm->fd; 59eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke} 60eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 61eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke/* FIXME: maybe superfluous, use udev subclass from the fd? */ 62baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford/** Get the backend name for the given gbm device 63baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 64baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \return The backend name string - this belongs to the device and must not 65baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * be freed 66baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford */ 67eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT const char * 68eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkegbm_device_get_backend_name(struct gbm_device *gbm) 69eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{ 70eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return gbm->name; 71eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke} 72eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 73baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford/** Test if a format is supported for a given set of usage flags. 74baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 75baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param gbm The created buffer manager 76baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param format The format to test 77baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param usage A bitmask of the usages to test the format against 78baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \return 1 if the format is supported otherwise 0 79baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 80baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \sa enum gbm_bo_flags for the list of flags that the format can be 81baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * tested against 82baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 83baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \sa enum gbm_bo_format for the list of formats 84baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford */ 85eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkeint 86eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkegbm_device_is_format_supported(struct gbm_device *gbm, 870d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira uint32_t format, uint32_t usage) 88eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{ 89eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return gbm->is_format_supported(gbm, format, usage); 90eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke} 91eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 92baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford/** Destroy the gbm device and free all resources associated with it. 93baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 94baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param gbm The device created using gbm_create_device() 95baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford */ 96eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT void 97eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkegbm_device_destroy(struct gbm_device *gbm) 98eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{ 99eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke gbm->refcount--; 100eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke if (gbm->refcount == 0) 101eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke gbm->destroy(gbm); 102eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke} 103eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 104eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT struct gbm_device * 105eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke_gbm_mesa_get_device(int fd) 106eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{ 107eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke struct gbm_device *gbm = NULL; 108eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke struct stat buf; 109eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke dev_t dev; 110eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke int i; 111eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 112eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke if (fd < 0 || fstat(fd, &buf) < 0 || !S_ISCHR(buf.st_mode)) { 113eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke fprintf(stderr, "_gbm_mesa_get_device: invalid fd: %d\n", fd); 114eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return NULL; 115eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke } 116eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 117eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke for (i = 0; i < device_num; ++i) { 118eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke dev = devices[i]->stat.st_rdev; 119eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke if (major(dev) == major(buf.st_rdev) && 120eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke minor(dev) == minor(buf.st_rdev)) { 121eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke gbm = devices[i]; 122eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke gbm->refcount++; 123eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke break; 124eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke } 125eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke } 126eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 127eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return gbm; 128eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke} 129eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 130baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford/** Create a gbm device for allocating buffers 131baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 132baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * The file descriptor passed in is used by the backend to communicate with 133baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * platform for allocating the memory. For allocations using DRI this would be 134baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * the file descriptor returned when opening a device such as \c 135baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * /dev/dri/card0 136baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 137baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param fd The file descriptor for an backend specific device 138baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \return The newly created struct gbm_device. The resources associated with 139baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * the device should be freed with gbm_device_destroy() when it is no longer 140baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * needed. If the creation of the device failed NULL will be returned. 141baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford */ 142eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT struct gbm_device * 143eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkegbm_create_device(int fd) 144eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{ 145eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke struct gbm_device *gbm = NULL; 146eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke struct stat buf; 147eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 148eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke if (fd < 0 || fstat(fd, &buf) < 0 || !S_ISCHR(buf.st_mode)) { 149eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke fprintf(stderr, "gbm_create_device: invalid fd: %d\n", fd); 150eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return NULL; 151eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke } 152eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 153eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke if (device_num == 0) 154eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke memset(devices, 0, sizeof devices); 155eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 156eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke gbm = _gbm_create_device(fd); 157eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke if (gbm == NULL) 158eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return NULL; 159eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 160eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke gbm->dummy = gbm_create_device; 161eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke gbm->stat = buf; 162eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke gbm->refcount = 1; 163eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 164eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke if (device_num < ARRAY_SIZE(devices)-1) 165eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke devices[device_num++] = gbm; 166eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 167eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return gbm; 168eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke} 169eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 170baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford/** Get the width of the buffer object 171baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 172baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param bo The buffer object 173baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \return The width of the allocated buffer object 174baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 175baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford */ 176eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT unsigned int 177eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkegbm_bo_get_width(struct gbm_bo *bo) 178eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{ 179eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return bo->width; 180eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke} 181eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 182baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford/** Get the height of the buffer object 183baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 184baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param bo The buffer object 185baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \return The height of the allocated buffer object 186baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford */ 187eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT unsigned int 188eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkegbm_bo_get_height(struct gbm_bo *bo) 189eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{ 190eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return bo->height; 191eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke} 192eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 193baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford/** Get the stride of the buffer object 194baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 195baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * This is calculated by the backend when it does the allocation in 196baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * gbm_bo_create() 197baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 198baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param bo The buffer object 1997250cd506baa0bd4649b30d87509cdd0cbc06a57Kristian Høgsberg * \return The stride of the allocated buffer object in bytes 200baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford */ 201eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT uint32_t 2027250cd506baa0bd4649b30d87509cdd0cbc06a57Kristian Høgsberggbm_bo_get_stride(struct gbm_bo *bo) 203eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{ 2047250cd506baa0bd4649b30d87509cdd0cbc06a57Kristian Høgsberg return bo->stride; 205eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke} 206eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 2078de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes/** Get the format of the buffer object 2088de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes * 2098de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes * The format of the pixels in the buffer. 2108de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes * 2118de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes * \param bo The buffer object 2128de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes * \return The format of buffer object, on of the GBM_FORMAT_* codes 2138de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes */ 2148de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse BarnesGBM_EXPORT uint32_t 2158de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnesgbm_bo_get_format(struct gbm_bo *bo) 2168de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes{ 2178de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes return bo->format; 2188de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes} 2198de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes 220baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford/** Get the handle of the buffer object 221baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 222baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * This is stored in the platform generic union gbm_bo_handle type. However 223baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * the format of this handle is platform specific. 224baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 225baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param bo The buffer object 22633f8a3cfbe85db6514231d8ebc622af1f2139a13Ander Conselvan de Oliveira * \return Returns the handle of the allocated buffer object 227baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford */ 228eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT union gbm_bo_handle 229eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkegbm_bo_get_handle(struct gbm_bo *bo) 230eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{ 231eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return bo->handle; 232eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke} 233eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 2344fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg/** Write data into the buffer object 2354fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg * 2364fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg * If the buffer object was created with the GBM_BO_USE_WRITE flag, 2374fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg * this function can used to write data into the buffer object. The 2384fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg * data is copied directly into the object and it's the responsiblity 2394fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg * of the caller to make sure the data represents valid pixel data, 2404fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg * according to the width, height, stride and format of the buffer object. 2414fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg * 2424fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg * \param bo The buffer object 2434fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg * \param buf The data to write 2444fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg * \param count The number of bytes to write 2454fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg * \return Returns -1 on error, 0 otherwise 2464fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg */ 2474fddb2ba21add1c1968330e5224ecead59da3995Kristian HøgsbergGBM_EXPORT int 2484fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberggbm_bo_write(struct gbm_bo *bo, const void *buf, size_t count) 2494fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg{ 2504fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg return bo->gbm->bo_write(bo, buf, count); 2514fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg} 2524fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg 2536c84f2992fee8b866b9f7434c8c26613b67dc2d4Ander Conselvan de Oliveira/** Get the gbm device used to create the buffer object 2546c84f2992fee8b866b9f7434c8c26613b67dc2d4Ander Conselvan de Oliveira * 2556c84f2992fee8b866b9f7434c8c26613b67dc2d4Ander Conselvan de Oliveira * \param bo The buffer object 2566c84f2992fee8b866b9f7434c8c26613b67dc2d4Ander Conselvan de Oliveira * \return Returns the gbm device with which the buffer object was created 2576c84f2992fee8b866b9f7434c8c26613b67dc2d4Ander Conselvan de Oliveira */ 2586c84f2992fee8b866b9f7434c8c26613b67dc2d4Ander Conselvan de OliveiraGBM_EXPORT struct gbm_device * 2596c84f2992fee8b866b9f7434c8c26613b67dc2d4Ander Conselvan de Oliveiragbm_bo_get_device(struct gbm_bo *bo) 2606c84f2992fee8b866b9f7434c8c26613b67dc2d4Ander Conselvan de Oliveira{ 2616c84f2992fee8b866b9f7434c8c26613b67dc2d4Ander Conselvan de Oliveira return bo->gbm; 2626c84f2992fee8b866b9f7434c8c26613b67dc2d4Ander Conselvan de Oliveira} 2636c84f2992fee8b866b9f7434c8c26613b67dc2d4Ander Conselvan de Oliveira 264310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira/** Set the user data associated with a buffer object 265310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira * 266310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira * \param bo The buffer object 267310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira * \param data The data to associate to the buffer object 268310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira * \param destroy_user_data A callback (which may be %NULL) that will be 269310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira * called prior to the buffer destruction 270310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira */ 271310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de OliveiraGBM_EXPORT void 272310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveiragbm_bo_set_user_data(struct gbm_bo *bo, void *data, 273310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira void (*destroy_user_data)(struct gbm_bo *, void *)) 274310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira{ 275310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira bo->user_data = data; 276310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira bo->destroy_user_data = destroy_user_data; 277310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira} 278310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira 279310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira/** Get the user data associated with a buffer object 280310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira * 281310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira * \param bo The buffer object 282310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira * \return Returns the user data associated with the buffer object or %NULL 283310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira * if no data was associated with it 284310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira * 285310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira * \sa gbm_bo_set_user_data() 286310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira */ 287310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de OliveiraGBM_EXPORT void * 288310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveiragbm_bo_get_user_data(struct gbm_bo *bo) 289310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira{ 290310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira return bo->user_data; 291310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira} 292310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira 293baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford/** 294baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * Destroys the given buffer object and frees all resources associated with 295baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * it. 296baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 297baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param bo The buffer object 298baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford */ 299eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT void 300eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkegbm_bo_destroy(struct gbm_bo *bo) 301eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{ 302310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira if (bo->destroy_user_data) 303310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira bo->destroy_user_data(bo, bo->user_data); 304310d8d189d14eb6c29be205bf2c9e98187b2fa84Ander Conselvan de Oliveira 305eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke bo->gbm->bo_destroy(bo); 306eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke} 307eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 308baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford/** 309baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * Allocate a buffer object for the given dimensions 310baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 311baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param gbm The gbm device returned from gbm_create_device() 312baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param width The width for the buffer 313baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param height The height for the buffer 314baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param format The format to use for the buffer 315baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param usage The union of the usage flags for this buffer 316baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 317baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \return A newly allocated buffer that should be freed with gbm_bo_destroy() 318baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * when no longer needed. If an error occurs during allocation %NULL will be 319baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * returned. 320baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 321baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \sa enum gbm_bo_format for the list of formats 322baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \sa enum gbm_bo_flags for the list of usage flags 323baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford */ 324eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT struct gbm_bo * 325eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzkegbm_bo_create(struct gbm_device *gbm, 326eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke uint32_t width, uint32_t height, 3270d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira uint32_t format, uint32_t usage) 328eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{ 329eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke if (width == 0 || height == 0) 330eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return NULL; 331eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 332eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke if (usage & GBM_BO_USE_CURSOR_64X64 && 333eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke (width != 64 || height != 64)) 334eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return NULL; 335eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 336eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke return gbm->bo_create(gbm, width, height, format, usage); 337eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke} 338eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke 339baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford/** 34044f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * Create a gbm buffer object from an foreign object 34144f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * 34244f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * This function imports a foreign object and creates a new gbm bo for it. 34344f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * This enabled using the foreign object with a display API such as KMS. 34444f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * Currently two types of foreign objects are supported, indicated by the type 34544f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * argument: 34644f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * 34744f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * GBM_BO_IMPORT_WL_BUFFER 34844f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * GBM_BO_IMPORT_EGL_IMAGE 34944f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * 35044f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * The the gbm bo shares the underlying pixels but its life-time is 35144f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * independent of the foreign object. 352baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 353baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param gbm The gbm device returned from gbm_create_device() 35444f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * \param gbm The type of object we're importing 35544f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg * \param gbm Pointer to the external object 356baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \param usage The union of the usage flags for this buffer 357baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 358baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \return A newly allocated buffer object that should be freed with 359baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * gbm_bo_destroy() when no longer needed. 360baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * 361baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford * \sa enum gbm_bo_flags for the list of usage flags 362baab68e1a607b818c8988e70546fe3e6f97cf572Rob Bradford */ 363eddcecbf74da26716509c047b95e85b00c12bab4Benjamin FranzkeGBM_EXPORT struct gbm_bo * 36444f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberggbm_bo_import(struct gbm_device *gbm, 36544f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg uint32_t type, void *buffer, uint32_t usage) 366eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke{ 36744f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg return gbm->bo_import(gbm, type, buffer, usage); 368eddcecbf74da26716509c047b95e85b00c12bab4Benjamin Franzke} 3690d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira 3700d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira/** 3710d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * Allocate a surface object 3720d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 3730d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * \param gbm The gbm device returned from gbm_create_device() 3740d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * \param width The width for the surface 3750d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * \param height The height for the surface 3760d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * \param format The format to use for the surface 3770d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 3780d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * \return A newly allocated surface that should be freed with 3790d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * gbm_surface_destroy() when no longer needed. If an error occurs 3800d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * during allocation %NULL will be returned. 3810d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 3820d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * \sa enum gbm_bo_format for the list of formats 3830d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira */ 3840d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de OliveiraGBM_EXPORT struct gbm_surface * 3850d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveiragbm_surface_create(struct gbm_device *gbm, 3860d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira uint32_t width, uint32_t height, 3870d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira uint32_t format, uint32_t flags) 3880d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira{ 3890d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira return gbm->surface_create(gbm, width, height, format, flags); 3900d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira} 3910d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira 3920d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira/** 3930d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * Destroys the given surface and frees all resources associated with 3940d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * it. 3950d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 3960d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * All buffers locked with gbm_surface_lock_front_buffer() should be 3970d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * released prior to calling this function. 3980d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 3990d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * \param surf The surface 4000d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira */ 4010d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de OliveiraGBM_EXPORT void 4020d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveiragbm_surface_destroy(struct gbm_surface *surf) 4030d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira{ 4040d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira surf->gbm->surface_destroy(surf); 4050d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira} 4060d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira 4070d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira/** 4080d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * Lock the surface's current front buffer 4090d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 4100d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * Lock rendering to the surface's current front buffer until it is 4110d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * released with gbm_surface_release_buffer(). 4120d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 4130d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * This function must be called exactly once after calling 4140d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * eglSwapBuffers. Calling it before any eglSwapBuffer has happened 4150d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * on the surface or two or more times after eglSwapBuffers is an 4160d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * error. A new bo representing the new front buffer is returned. On 4170d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * multiple invocations, all the returned bos must be released in 4180d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * order to release the actual surface buffer. 4190d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 4200d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * \param surf The surface 4210d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 42255aab92495692f453c04f5b99e67bcb77cd27e14Ander Conselvan de Oliveira * \return A buffer object that should be released with 42355aab92495692f453c04f5b99e67bcb77cd27e14Ander Conselvan de Oliveira * gbm_surface_release_buffer() when no longer needed. The implementation 42455aab92495692f453c04f5b99e67bcb77cd27e14Ander Conselvan de Oliveira * is free to reuse buffers released with gbm_surface_release_buffer() so 42555aab92495692f453c04f5b99e67bcb77cd27e14Ander Conselvan de Oliveira * this bo should not be destroyed using gbm_bo_destroy(). If an error 42655aab92495692f453c04f5b99e67bcb77cd27e14Ander Conselvan de Oliveira * occurs this function returns %NULL. 4270d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira */ 4280d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de OliveiraGBM_EXPORT struct gbm_bo * 4290d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveiragbm_surface_lock_front_buffer(struct gbm_surface *surf) 4300d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira{ 4310d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira return surf->gbm->surface_lock_front_buffer(surf); 4320d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira} 4330d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira 4340d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira/** 4350d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * Release a locked buffer obtained with gbm_surface_lock_front_buffer() 4360d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 43755aab92495692f453c04f5b99e67bcb77cd27e14Ander Conselvan de Oliveira * Returns the underlying buffer to the gbm surface. Releasing a bo 43855aab92495692f453c04f5b99e67bcb77cd27e14Ander Conselvan de Oliveira * will typically make gbm_surface_has_free_buffer() return 1 and thus 43955aab92495692f453c04f5b99e67bcb77cd27e14Ander Conselvan de Oliveira * allow rendering the next frame, but not always. The implementation 44055aab92495692f453c04f5b99e67bcb77cd27e14Ander Conselvan de Oliveira * may choose to destroy the bo immediately or reuse it, in which case 44155aab92495692f453c04f5b99e67bcb77cd27e14Ander Conselvan de Oliveira * the user data associated with it is unchanged. 4420d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 4430d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * \param surf The surface 4440d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * \param bo The buffer object 4450d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira */ 4460d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de OliveiraGBM_EXPORT void 4470d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveiragbm_surface_release_buffer(struct gbm_surface *surf, struct gbm_bo *bo) 4480d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira{ 4490d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira surf->gbm->surface_release_buffer(surf, bo); 4500d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira} 4510d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira 4520d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira/** 4530d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * Return whether or not a surface has free (non-locked) buffers 4540d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 4550d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * Before starting a new frame, the surface must have a buffer 4560d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * available for rendering. Initially, a gbm surface will have a free 4570d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * buffer, but after one of more buffers have been locked (\sa 4580d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * gbm_surface_lock_front_buffer()), the application must check for a 4590d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * free buffer before rendering. 4600d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 4610d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * If a surface doesn't have a free buffer, the application must 4620d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * return a buffer to the surface using gbm_surface_release_buffer() 4630d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * and after that, the application can query for free buffers again. 4640d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * 4650d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * \param surf The surface 4660d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira * \return 1 if the surface has free buffers, 0 otherwise 4670d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira */ 4680d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de OliveiraGBM_EXPORT int 4690d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveiragbm_surface_has_free_buffers(struct gbm_surface *surf) 4700d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira{ 4710d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira return surf->gbm->surface_has_free_buffers(surf); 4720d1ef1f57f9011fd2bc3354d60fb19db29af7363Ander Conselvan de Oliveira} 473