static gboolean _cogl_pixel_buffer_set_data (CoglBuffer *buffer, unsigned int offset, const guint8 *data, unsigned int size) { CoglPixelBuffer *pixel_buffer = COGL_PIXEL_BUFFER (buffer); _COGL_GET_CONTEXT (ctx, FALSE); pixel_buffer->gl_target = GL_PIXEL_UNPACK_BUFFER; _cogl_buffer_bind (buffer, pixel_buffer->gl_target); /* create an empty store if we don't have one yet. creating the store * lazily allows the user of the CoglBuffer to set a hint before the * store is created. */ if (!COGL_PIXEL_BUFFER_FLAG_IS_SET (pixel_buffer, STORE_CREATED)) { GE( glBufferData (pixel_buffer->gl_target, buffer->size, NULL, _cogl_buffer_hints_to_gl_enum (buffer->usage_hint, buffer->update_hint)) ); COGL_PIXEL_BUFFER_SET_FLAG (pixel_buffer, STORE_CREATED); } GE( glBufferSubData (pixel_buffer->gl_target, offset, size, data) ); _cogl_buffer_bind (NULL, pixel_buffer->gl_target); return TRUE; }
CoglHandle cogl_pixel_buffer_new_for_size_EXP (unsigned int width, unsigned int height, CoglPixelFormat format, unsigned int *rowstride) { CoglHandle buffer; CoglPixelBuffer *pixel_buffer; unsigned int stride; /* creating a buffer to store "any" format does not make sense */ if (G_UNLIKELY (format == COGL_PIXEL_FORMAT_ANY)) return COGL_INVALID_HANDLE; /* for now we fallback to cogl_pixel_buffer_new_EXP, later, we could ask * libdrm a tiled buffer for instance */ stride = width * _cogl_get_format_bpp (format); if (rowstride) *rowstride = stride; buffer = cogl_pixel_buffer_new_EXP (height * stride); if (G_UNLIKELY (buffer == COGL_INVALID_HANDLE)) return COGL_INVALID_HANDLE; pixel_buffer = COGL_PIXEL_BUFFER (buffer); pixel_buffer->width = width; pixel_buffer->height = height; pixel_buffer->format = format; pixel_buffer->stride = stride; return buffer; }
CoglPixelBuffer * cogl_bitmap_get_buffer (CoglBitmap *bitmap) { while (bitmap->shared_bmp) bitmap = bitmap->shared_bmp; return COGL_PIXEL_BUFFER (bitmap->buffer); }
static void _cogl_pixel_buffer_unmap (CoglBuffer *buffer) { CoglPixelBuffer *pixel_buffer = COGL_PIXEL_BUFFER (buffer); _COGL_GET_CONTEXT (ctx, NO_RETVAL); _cogl_buffer_bind (buffer, pixel_buffer->gl_target); GE( glUnmapBuffer (pixel_buffer->gl_target) ); COGL_BUFFER_CLEAR_FLAG (buffer, MAPPED); _cogl_buffer_bind (NULL, pixel_buffer->gl_target); }
static guint8 * _cogl_pixel_buffer_map (CoglBuffer *buffer, CoglBufferAccess access) { CoglPixelBuffer *pixel_buffer = COGL_PIXEL_BUFFER (buffer); GLenum gl_target; guint8 *data; _COGL_GET_CONTEXT (ctx, NULL); /* we determine the target lazily, on the first map */ gl_target = GL_PIXEL_UNPACK_BUFFER; pixel_buffer->gl_target = gl_target; _cogl_buffer_bind (buffer, gl_target); /* create an empty store if we don't have one yet. creating the store * lazily allows the user of the CoglBuffer to set a hint before the * store is created. */ if (!COGL_PIXEL_BUFFER_FLAG_IS_SET (pixel_buffer, STORE_CREATED)) { GE( glBufferData (gl_target, buffer->size, NULL, _cogl_buffer_hints_to_gl_enum (buffer->usage_hint, buffer->update_hint)) ); COGL_PIXEL_BUFFER_SET_FLAG (pixel_buffer, STORE_CREATED); } GE_RET( data, glMapBuffer (gl_target, _cogl_buffer_access_to_gl_enum (access)) ); if (data) COGL_BUFFER_SET_FLAG (buffer, MAPPED); _cogl_buffer_bind (NULL, gl_target); return data; }