Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
CoglPixelBuffer *
cogl_bitmap_get_buffer (CoglBitmap *bitmap)
{
  while (bitmap->shared_bmp)
    bitmap = bitmap->shared_bmp;

  return COGL_PIXEL_BUFFER (bitmap->buffer);
}
Пример #4
0
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);
}
Пример #5
0
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;
}