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; }
static void bo_recreate_store (CoglBuffer *buffer) { GLenum gl_target; GLenum gl_enum; /* This assumes the buffer is already bound */ gl_target = convert_bind_target_to_gl_target (buffer->last_target); gl_enum = _cogl_buffer_hints_to_gl_enum (buffer); GE( buffer->context, glBufferData (gl_target, buffer->size, NULL, gl_enum) ); buffer->store_created = TRUE; }
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; }