mutter/cogl/cogl-driver.h
Robert Bragg a57195d16d framebuffer: split out GL read_pixels code
This moves the direct use of GL in cogl-framebuffer.c for handling
cogl_framebuffer_read_pixels_into_bitmap() into
driver/gl/cogl-framebuffer-gl.c and adds a
->framebuffer_read_pixels_into_bitmap vfunc to CoglDriverVtable.

Reviewed-by: Neil Roberts <neil@linux.intel.com>

(cherry picked from commit 2f893054d6754e6bc7983f061b27c7858f1a593c)
2013-01-22 17:48:17 +00:00

292 lines
10 KiB
C

/*
* Cogl
*
* An object oriented GL/GLES Abstraction/Utility Layer
*
* Copyright (C) 2012 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*
*/
#ifndef __COGL_DRIVER_H
#define __COGL_DRIVER_H
#include "cogl-context.h"
#include "cogl-offscreen.h"
#include "cogl-framebuffer-private.h"
#include "cogl-attribute-private.h"
typedef struct _CoglDriverVtable CoglDriverVtable;
struct _CoglDriverVtable
{
/* TODO: factor this out since this is OpenGL specific and
* so can be ignored by non-OpenGL drivers. */
CoglBool
(* pixel_format_from_gl_internal) (CoglContext *context,
GLenum gl_int_format,
CoglPixelFormat *out_format);
/* TODO: factor this out since this is OpenGL specific and
* so can be ignored by non-OpenGL drivers. */
CoglPixelFormat
(* pixel_format_to_gl) (CoglContext *context,
CoglPixelFormat format,
GLenum *out_glintformat,
GLenum *out_glformat,
GLenum *out_gltype);
CoglBool
(* update_features) (CoglContext *context,
CoglError **error);
CoglBool
(* offscreen_allocate) (CoglOffscreen *offscreen,
CoglError **error);
void
(* offscreen_free) (CoglOffscreen *offscreen);
void
(* framebuffer_flush_state) (CoglFramebuffer *draw_buffer,
CoglFramebuffer *read_buffer,
CoglFramebufferState state);
void
(* framebuffer_clear) (CoglFramebuffer *framebuffer,
unsigned long buffers,
float red,
float green,
float blue,
float alpha);
void
(* framebuffer_query_bits) (CoglFramebuffer *framebuffer,
int *red,
int *green,
int *blue,
int *alpha);
void
(* framebuffer_finish) (CoglFramebuffer *framebuffer);
void
(* framebuffer_discard_buffers) (CoglFramebuffer *framebuffer,
unsigned long buffers);
void
(* framebuffer_draw_attributes) (CoglFramebuffer *framebuffer,
CoglPipeline *pipeline,
CoglVerticesMode mode,
int first_vertex,
int n_vertices,
CoglAttribute **attributes,
int n_attributes,
CoglDrawFlags flags);
void
(* framebuffer_draw_indexed_attributes) (CoglFramebuffer *framebuffer,
CoglPipeline *pipeline,
CoglVerticesMode mode,
int first_vertex,
int n_vertices,
CoglIndices *indices,
CoglAttribute **attributes,
int n_attributes,
CoglDrawFlags flags);
CoglBool
(* framebuffer_read_pixels_into_bitmap) (CoglFramebuffer *framebuffer,
int x,
int y,
CoglReadPixelsFlags source,
CoglBitmap *bitmap,
CoglError **error);
/* Destroys any driver specific resources associated with the given
* 2D texture. */
void
(* texture_2d_free) (CoglTexture2D *tex_2d);
/* Returns TRUE if the driver can support creating a 2D texture with
* the given geometry and specified internal format.
*/
CoglBool
(* texture_2d_can_create) (CoglContext *ctx,
int width,
int height,
CoglPixelFormat internal_format);
/* Initializes driver private state before allocating any specific
* storage for a 2D texture, where base texture and texture 2D
* members will already be initialized before passing control to
* the driver.
*/
void
(* texture_2d_init) (CoglTexture2D *tex_2d);
/* Instantiates a new CoglTexture2D object with un-initialized
* storage for a given size and internal format */
CoglTexture2D *
(* texture_2d_new_with_size) (CoglContext *ctx,
int width,
int height,
CoglPixelFormat internal_format,
CoglError **error);
/* Instantiates a new CoglTexture2D object with storage initialized
* with the contents of the given bitmap, using the specified
* internal format.
*/
CoglTexture2D *
(* texture_2d_new_from_bitmap) (CoglBitmap *bmp,
CoglPixelFormat internal_format,
CoglError **error);
#if defined (COGL_HAS_EGL_SUPPORT) && defined (EGL_KHR_image_base)
/* Instantiates a new CoglTexture2D object with storage initialized
* with the contents of the given EGL image.
*
* This is optional for drivers to support
*/
CoglTexture2D *
(* egl_texture_2d_new_from_image) (CoglContext *ctx,
int width,
int height,
CoglPixelFormat format,
EGLImageKHR image,
CoglError **error);
#endif
/* Initialize the specified region of storage of the given texture
* with the contents of the specified framebuffer region
*/
void
(* texture_2d_copy_from_framebuffer) (CoglTexture2D *tex_2d,
int src_x,
int src_y,
int width,
int height,
CoglFramebuffer *src_fb,
int dst_x,
int dst_y,
int level);
/* If the given texture has a corresponding OpenGL texture handle
* then return that.
*
* This is optional
*/
unsigned int
(* texture_2d_get_gl_handle) (CoglTexture2D *tex_2d);
/* Update all mipmap levels > 0 */
void
(* texture_2d_generate_mipmap) (CoglTexture2D *tex_2d);
/* Initialize the specified region of storage of the given texture
* with the contents of the specified bitmap region
*
* Since this may need to create the underlying storage first
* it may throw a NO_MEMORY error.
*/
CoglBool
(* texture_2d_copy_from_bitmap) (CoglTexture2D *tex_2d,
int src_x,
int src_y,
int width,
int height,
CoglBitmap *bitmap,
int dst_x,
int dst_y,
int level,
CoglError **error);
/* Reads back the full contents of the given texture and write it to
* @data in the given @format and with the given @rowstride.
*
* This is optional
*/
void
(* texture_2d_get_data) (CoglTexture2D *tex_2d,
CoglPixelFormat format,
int rowstride,
uint8_t *data);
/* Prepares for drawing by flushing the journal, framebuffer state,
* pipeline state and attribute state.
*/
void
(* flush_attributes_state) (CoglFramebuffer *framebuffer,
CoglPipeline *pipeline,
CoglFlushLayerState *layer_state,
CoglDrawFlags flags,
CoglAttribute **attributes,
int n_attributes);
/* Flushes the clip stack to the GPU using a combination of the
* stencil buffer, scissor and clip plane state.
*/
void
(* clip_stack_flush) (CoglClipStack *stack, CoglFramebuffer *framebuffer);
/* Enables the driver to create some meta data to represent a buffer
* but with no corresponding storage allocated yet.
*/
void
(* buffer_create) (CoglBuffer *buffer);
void
(* buffer_destroy) (CoglBuffer *buffer);
/* Maps a buffer into the CPU */
void *
(* buffer_map_range) (CoglBuffer *buffer,
size_t offset,
size_t size,
CoglBufferAccess access,
CoglBufferMapHint hints,
CoglError **error);
/* Unmaps a buffer */
void
(* buffer_unmap) (CoglBuffer *buffer);
/* Uploads data to the buffer without needing to map it necessarily
*/
CoglBool
(* buffer_set_data) (CoglBuffer *buffer,
unsigned int offset,
const void *data,
unsigned int size,
CoglError **error);
};
#define COGL_DRIVER_ERROR (_cogl_driver_error_quark ())
typedef enum { /*< prefix=COGL_DRIVER_ERROR >*/
COGL_DRIVER_ERROR_UNKNOWN_VERSION,
COGL_DRIVER_ERROR_INVALID_VERSION,
COGL_DRIVER_ERROR_NO_SUITABLE_DRIVER_FOUND,
COGL_DRIVER_ERROR_FAILED_TO_LOAD_LIBRARY
} CoglDriverError;
uint32_t
_cogl_driver_error_quark (void);
#endif /* __COGL_DRIVER_H */