efl/src/modules/evas/engines/gl_common/evas_gl_core_private.h

372 lines
9.6 KiB
C

#ifndef _EVAS_GL_CORE_PRIVATE_H
#define _EVAS_GL_CORE_PRIVATE_H
#include "evas_gl_private.h"
#include "evas_gl_core.h"
#include "evas_gl_api_ext.h"
#define EVAS_GL_NO_GL_H_CHECK 1
#include "Evas_GL.h"
//#include "evas_gl_ext.h"
extern int _evas_gl_log_dom;
#ifdef ERR
# undef ERR
#endif
#define ERR(...) EINA_LOG_DOM_ERR(_evas_gl_log_dom, __VA_ARGS__)
#ifdef DBG
# undef DBG
#endif
#define DBG(...) EINA_LOG_DOM_DBG(_evas_gl_log_dom, __VA_ARGS__)
#ifdef INF
# undef INF
#endif
#define INF(...) EINA_LOG_DOM_INFO(_evas_gl_log_dom, __VA_ARGS__)
#ifdef WRN
# undef WRN
#endif
#define WRN(...) EINA_LOG_DOM_WARN(_evas_gl_log_dom, __VA_ARGS__)
#ifdef CRI
# undef CRI
#endif
#define CRI(...) EINA_LOG_DOM_CRIT(_evas_gl_log_dom, __VA_ARGS__)
struct _EVGL_Interface
{
// Returns the native display of evas engine.
void *(*display_get)(void *data);
// Returns the Window surface that evas uses for direct rendering opt
void *(*evas_surface_get)(void *data);
void *(*native_window_create)(void *data);
int (*native_window_destroy)(void *data, void *window);
// Creates/Destroys the native surface from evas engine.
void *(*surface_create)(void *data, void *native_window);
int (*surface_destroy)(void *data, void *surface);
// Creates/Destroys the native surface from evas engine.
void *(*context_create)(void *data, void *share_ctx, Evas_GL_Context_Version version);
int (*context_destroy)(void *data, void *context);
// Calls the make_current from evas_engine.
int (*make_current)(void *data, void *surface, void *context, int flush);
// Returns the get proc_address function
void *(*proc_address_get)(const char *name);
// Returns the string of supported extensions
const char *(*ext_string_get)(void *data);
// Returns the current rotation angle of evas
int (*rotation_angle_get)(void *data);
// Create a pbuffer surface
void *(*pbuffer_surface_create)(void *data, EVGL_Surface *evgl_sfc, const int *attrib_list);
int (*pbuffer_surface_destroy)(void *data, void *surface);
// Create a surface for 1.x & 3.x rendering (could be pbuffer or xpixmap for instance)
void *(*indirect_surface_create)(EVGL_Engine *evgl, void *data, EVGL_Surface *evgl_sfc, Evas_GL_Config *cfg, int w, int h);
// Destroy 1.x & 3.x surface (could be pbuffer or xpixmap for instance)
int (*indirect_surface_destroy)(void *data, EVGL_Surface *evgl_sfc);
// Create an indirect rendering context for GLES 1.x
void *(*gles_context_create)(void *data, EVGL_Context *share_ctx, EVGL_Surface *evgl_sfc);
// Check native window surface config for Evas GL Direct Rendering
void (*native_win_surface_config_get)(void *data, int *win_depth, int *win_stencil, int *win_msaa);
};
struct _EVGL_Surface
{
int w, h;
//-------------------------//
// Related to FBO Surface
// MSAA
GLint msaa_samples;
// Color Buffer Target
GLuint color_buf;
GLint color_ifmt;
GLenum color_fmt;
// Depth Buffer Target
GLuint depth_buf;
GLenum depth_fmt;
// Stencil Buffer Target
GLuint stencil_buf;
GLenum stencil_fmt;
// Depth_Stencil Target
GLuint depth_stencil_buf;
GLenum depth_stencil_fmt;
// Direct Rendering Options
unsigned direct_fb_opt : 1;
unsigned client_side_rotation : 1;
unsigned alpha : 1;
// Flag indicating this surface is used for indirect rendering
unsigned indirect : 1;
unsigned yinvert : 1;
// Moved from evgl_engine
unsigned direct_override : 1;
unsigned direct_mem_opt : 1;
// Init Flag
unsigned buffers_skip_allocate : 1;
unsigned buffers_allocated : 1;
void *cfg;
int cfg_index;
// Rough estimate of buffer in memory per renderbuffer
// 0. color 1. depth 2. stencil 3. depth_stencil
int buffer_mem[4];
//-------------------------//
// Used if indirect == 1
EVGLNative_Surface indirect_sfc;
void *indirect_sfc_native;
void *indirect_sfc_visual;
void *indirect_sfc_config;
void *egl_image;
//-------------------------//
// Related to PBuffer Surface
struct {
EVGLNative_Surface native_surface;
Evas_GL_Color_Format color_fmt;
Eina_Bool is_pbuffer : 1;
} pbuffer;
//-------------------------//
EVGL_Context *current_ctx;
};
struct _EVGL_Context
{
EVGLNative_Context context;
Evas_GL_Context_Version version;
int version_minor;
// Context FBO
GLuint surface_fbo;
// Current FBO
GLuint current_fbo;
GLuint current_draw_fbo; //for GLES3
GLuint current_read_fbo; //for GLES3
// Direct Rendering Related
unsigned scissor_enabled : 1;
unsigned scissor_updated : 1;
unsigned direct_scissor : 1;
unsigned viewport_updated : 1;
unsigned extension_checked : 1;
unsigned fbo_image_supported : 1;
unsigned pixmap_image_supported : 1;
int scissor_coord[4];
int viewport_coord[4];
int viewport_direct[4];
// For GLES1/GLES3 with indirect rendering
EVGLNative_Context indirect_context;
// Partial Rendering
int partial_render;
EVGL_Surface *current_sfc;
//glGetError
GLenum gl_error;
};
typedef enum _EVGL_Color_Bit
{
COLOR_NONE = 0,
COLOR_RGB_888 = 0x1,
COLOR_RGBA_8888 = 0x3,
} EVGL_Color_Bit;
typedef enum _EVGL_Depth_Bit
{
DEPTH_NONE = 0,
DEPTH_BIT_8 = 0x1,
DEPTH_BIT_16 = 0x3,
DEPTH_BIT_24 = 0x7,
DEPTH_BIT_32 = 0xF,
DEPTH_STENCIL = 0xFF,
} EVGL_Depth_Bit;
typedef enum _EVGL_Stencil_Bit
{
STENCIL_NONE = 0,
STENCIL_BIT_1 = 0x1,
STENCIL_BIT_2 = 0x3,
STENCIL_BIT_4 = 0x7,
STENCIL_BIT_8 = 0xF,
STENCIL_BIT_16 = 0x1F,
} EVGL_Stencil_Bit;
struct _EVGL_Surface_Format
{
int index;
EVGL_Color_Bit color_bit;
GLint color_ifmt;
GLenum color_fmt;
EVGL_Depth_Bit depth_bit;
GLenum depth_fmt;
EVGL_Stencil_Bit stencil_bit;
GLenum stencil_fmt;
GLenum depth_stencil_fmt;
int samples;
};
struct _EVGL_Cap
{
EVGL_Surface_Format fbo_fmts[100];
int num_fbo_fmts;
int max_w;
int max_h;
int msaa_supported;
int msaa_samples[3]; // High, Med, Low
};
struct _EVGL_Resource
{
Eina_Thread id;
EVGLNative_Display display;
EVGLNative_Context context;
EVGLNative_Window window;
EVGLNative_Surface surface;
EVGL_Context *current_ctx;
void *current_eng;
int error_state;
struct {
EVGLNative_Surface surface;
int rendered;
int rot;
int win_w;
int win_h;
struct {
int x, y, w, h;
} img;
struct {
int x, y, w, h;
} clip;
struct {
int preserve;
Eina_Bool enabled : 1;
} partial;
Eina_Bool enabled : 1;
Eina_Bool in_get_pixels : 1;
Eina_Bool render_op_copy : 1;
} direct;
struct {
GLclampf r, g, b, a;
} clear_color;
struct {
void *data;
void *surface;
void *context;
} stored;
};
struct _EVGL_Engine
{
int initted;
const EVGL_Interface *funcs;
EVGL_Cap caps;
const char *gl_ext;
const char *evgl_ext;
// Resource context/surface per Thread in TLS for evasgl use
LK(resource_lock);
Eina_TLS resource_key;
Eina_List *resource_list;
Eina_Thread main_tid;
// Add more debug logs (DBG levels 4 and 6)
int api_debug_mode;
// Force Off for Debug purposes
int direct_force_off;
// Other DR flags for debugging purposes
int direct_override;
int direct_mem_opt;
// Force Direct Scissoring off for Debug purposes
int direct_scissor_off;
// Keep track of all the current surfaces/contexts
Eina_List *surfaces;
Eina_List *contexts;
//void *engine_data;
Eina_Hash *safe_extensions;
};
// Evas GL Engine
extern EVGL_Engine *evgl_engine;
// Internally used functions
extern void _evgl_api_gles2_get(Evas_GL_API *api, Eina_Bool debug);
extern void _evgl_api_gles1_get(Evas_GL_API *api, Eina_Bool debug);
extern void _evgl_api_gles3_get(Evas_GL_API *funcs, void *(*get_proc_address)(const char *), Eina_Bool debug, int minor_version);
extern EVGL_Resource *_evgl_tls_resource_get(void);
extern EVGL_Resource *_evgl_tls_resource_create(void *data);
extern void _evgl_tls_resource_destroy(void *data);
extern EVGL_Context *_evgl_current_context_get(void);
extern int _evgl_not_in_pixel_get(void);
extern int _evgl_direct_enabled(void);
extern EVGLNative_Context _evgl_native_context_get(Evas_GL_Context *ctx);
extern void *_evgl_engine_data_get(Evas_GL *evasgl);
Eina_Bool _evgl_api_gles2_ext_init(void *getproc, const char *glueexts);
Eina_Bool _evgl_api_gles1_ext_init(void *getproc, const char *glueexts);
Eina_Bool _evgl_api_gles3_ext_init(void *getproc, const char *glueexts);
Evas_GL_API* _evgl_api_gles1_internal_get(void);
Evas_GL_API* _evgl_api_gles3_internal_get(void);
#endif //_EVAS_GL_CORE_PRIVATE_H