1 /*  RetroArch - A frontend for libretro.
2  *  Copyright (C) 2010-2014 - Hans-Kristian Arntzen
3  *  copyright (c) 2011-2017 - Daniel De Matteis
4  *
5  *  RetroArch is free software: you can redistribute it and/or modify it under the terms
6  *  of the GNU General Public License as published by the Free Software Found-
7  *  ation, either version 3 of the License, or (at your option) any later version.
8  *
9  *  RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
10  *  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11  *  PURPOSE.  See the GNU General Public License for more details.
12  *
13  *  You should have received a copy of the GNU General Public License along with RetroArch.
14  *  If not, see <http://www.gnu.org/licenses/>.
15  */
16 
17 #ifndef __GL_COMMON_H
18 #define __GL_COMMON_H
19 
20 #include <boolean.h>
21 #include <string.h>
22 #include <libretro.h>
23 #include <retro_common_api.h>
24 
25 #ifdef HAVE_CONFIG_H
26 #include "../../config.h"
27 #endif
28 
29 #include <gfx/math/matrix_4x4.h>
30 #include <gfx/scaler/scaler.h>
31 #include <glsym/glsym.h>
32 #include <formats/image.h>
33 
34 #include "../video_coord_array.h"
35 #include "../../retroarch.h"
36 
37 RETRO_BEGIN_DECLS
38 
39 #if defined(HAVE_PSGL)
40 #define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_OES
41 #define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_OES
42 #define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT
43 #elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__)))
44 #define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT
45 #define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_EXT
46 #define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT
47 #else
48 #define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER
49 #define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE
50 #define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0
51 #endif
52 
53 #if defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES3) || defined(HAVE_OPENGLES_3_1) || defined(HAVE_OPENGLES_3_2)
54 #define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER
55 #if defined(HAVE_OPENGLES2)
56 #define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_OES
57 #else
58 #define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8
59 #endif
60 #define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT
61 #define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT
62 #elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__)))
63 #define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER_EXT
64 #define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_EXT
65 #define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_EXT
66 #define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_EXT
67 #elif defined(HAVE_PSGL)
68 #define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER_OES
69 #define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_SCE
70 #define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_OES
71 #define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_OES
72 #else
73 #define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER
74 #define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8
75 #define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT
76 #define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT
77 #endif
78 
79 #if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__)))
80 #define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE_EXT
81 #elif defined(HAVE_PSGL)
82 #define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE_OES
83 #else
84 #define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE
85 #endif
86 
87 #if defined(HAVE_PSGL)
88 #define glGenerateMipmap glGenerateMipmapOES
89 #endif
90 
91 #if defined(__APPLE__) || defined(HAVE_PSGL)
92 #ifndef GL_RGBA32F
93 #define GL_RGBA32F GL_RGBA32F_ARB
94 #endif
95 #endif
96 
97 #if defined(HAVE_PSGL)
98 #define RARCH_GL_INTERNAL_FORMAT32 GL_ARGB_SCE
99 #define RARCH_GL_INTERNAL_FORMAT16 GL_RGB5 /* TODO: Verify if this is really 565 or just 555. */
100 #define RARCH_GL_TEXTURE_TYPE32 GL_BGRA
101 #define RARCH_GL_TEXTURE_TYPE16 GL_BGRA
102 #define RARCH_GL_FORMAT32 GL_UNSIGNED_INT_8_8_8_8_REV
103 #define RARCH_GL_FORMAT16 GL_RGB5
104 #elif defined(HAVE_OPENGLES)
105 /* Imgtec/SGX headers have this missing. */
106 #ifndef GL_BGRA_EXT
107 #define GL_BGRA_EXT 0x80E1
108 #endif
109 #ifndef GL_BGRA8_EXT
110 #define GL_BGRA8_EXT 0x93A1
111 #endif
112 #ifdef IOS
113 /* Stupid Apple */
114 #define RARCH_GL_INTERNAL_FORMAT32 GL_RGBA
115 #else
116 #define RARCH_GL_INTERNAL_FORMAT32 GL_BGRA_EXT
117 #endif
118 #define RARCH_GL_INTERNAL_FORMAT16 GL_RGB
119 #define RARCH_GL_TEXTURE_TYPE32 GL_BGRA_EXT
120 #define RARCH_GL_TEXTURE_TYPE16 GL_RGB
121 #define RARCH_GL_FORMAT32 GL_UNSIGNED_BYTE
122 #define RARCH_GL_FORMAT16 GL_UNSIGNED_SHORT_5_6_5
123 #else
124 /* On desktop, we always use 32-bit. */
125 #define RARCH_GL_INTERNAL_FORMAT32 GL_RGBA8
126 #define RARCH_GL_INTERNAL_FORMAT16 GL_RGBA8
127 #define RARCH_GL_TEXTURE_TYPE32 GL_BGRA
128 #define RARCH_GL_TEXTURE_TYPE16 GL_BGRA
129 #define RARCH_GL_FORMAT32 GL_UNSIGNED_INT_8_8_8_8_REV
130 #define RARCH_GL_FORMAT16 GL_UNSIGNED_INT_8_8_8_8_REV
131 
132 /* GL_RGB565 internal format isn't in desktop GL
133  * until 4.1 core (ARB_ES2_compatibility).
134  * Check for this. */
135 #ifndef GL_RGB565
136 #define GL_RGB565 0x8D62
137 #endif
138 #define RARCH_GL_INTERNAL_FORMAT16_565 GL_RGB565
139 #define RARCH_GL_TEXTURE_TYPE16_565 GL_RGB
140 #define RARCH_GL_FORMAT16_565 GL_UNSIGNED_SHORT_5_6_5
141 #endif
142 
143 #if defined(HAVE_OPENGLES2) /* TODO: Figure out exactly what. */
144 #define NO_GL_CLAMP_TO_BORDER
145 #endif
146 
147 #if defined(HAVE_OPENGLES)
148 #ifndef GL_UNPACK_ROW_LENGTH
149 #define GL_UNPACK_ROW_LENGTH  0x0CF2
150 #endif
151 
152 #ifndef GL_SRGB_ALPHA_EXT
153 #define GL_SRGB_ALPHA_EXT 0x8C42
154 #endif
155 #endif
156 
157 typedef struct gl gl_t;
158 
159 struct gl
160 {
161    const shader_backend_t *shader;
162    void *shader_data;
163    void *renderchain_data;
164    void *ctx_data;
165    const gfx_ctx_driver_t *ctx_driver;
166    void *empty_buf;
167    void *conv_buffer;
168    void *readback_buffer_screenshot;
169    const float *vertex_ptr;
170    const float *white_color_ptr;
171    float *overlay_vertex_coord;
172    float *overlay_tex_coord;
173    float *overlay_color_coord;
174 
175    int version_major;
176    int version_minor;
177 
178    GLuint tex_mag_filter;
179    GLuint tex_min_filter;
180    GLuint fbo_feedback;
181    GLuint fbo_feedback_texture;
182    GLuint pbo;
183    GLuint *overlay_tex;
184    GLuint menu_texture;
185    GLuint pbo_readback[4];
186    GLuint texture[GFX_MAX_TEXTURES];
187    GLuint hw_render_fbo[GFX_MAX_TEXTURES];
188 
189 #ifdef HAVE_VIDEO_LAYOUT
190    GLuint video_layout_fbo;
191    GLuint video_layout_fbo_texture;
192    GLuint video_layout_white_texture;
193 #endif
194 
195    unsigned video_width;
196    unsigned video_height;
197 
198    unsigned tex_index; /* For use with PREV. */
199    unsigned textures;
200    unsigned fbo_feedback_pass;
201    unsigned rotation;
202    unsigned vp_out_width;
203    unsigned vp_out_height;
204    unsigned tex_w;
205    unsigned tex_h;
206    unsigned base_size; /* 2 or 4 */
207    unsigned overlays;
208    unsigned pbo_readback_index;
209    unsigned last_width[GFX_MAX_TEXTURES];
210    unsigned last_height[GFX_MAX_TEXTURES];
211 
212    float menu_texture_alpha;
213 
214    GLenum internal_fmt;
215    GLenum texture_type; /* RGB565 or ARGB */
216    GLenum texture_fmt;
217    GLenum wrap_mode;
218 
219    struct scaler_ctx pbo_readback_scaler;
220    struct video_viewport vp;                          /* int alignment */
221    math_matrix_4x4 mvp, mvp_no_rot;
222    struct video_coords coords;                        /* ptr alignment */
223    struct scaler_ctx scaler;
224    video_info_t video_info;
225    struct video_tex_info tex_info;                    /* unsigned int alignment */
226    struct video_tex_info prev_info[GFX_MAX_TEXTURES]; /* unsigned alignment */
227    struct video_fbo_rect fbo_rect[GFX_MAX_SHADERS];   /* unsigned alignment */
228 
229 #ifdef HAVE_VIDEO_LAYOUT
230    bool video_layout_resize;
231 #endif
232    bool vsync;
233    bool tex_mipmap;
234    bool fbo_inited;
235    bool fbo_feedback_enable;
236    bool hw_render_fbo_init;
237    bool has_fbo;
238    bool hw_render_use;
239    bool core_context_in_use;
240    bool shared_context_use;
241 
242    bool should_resize;
243    bool quitting;
244    bool fullscreen;
245    bool keep_aspect;
246    bool support_unpack_row_length;
247    bool have_es2_compat;
248    bool have_full_npot_support;
249    bool have_mipmap;
250 
251    bool overlay_enable;
252    bool overlay_full_screen;
253    bool menu_texture_enable;
254    bool menu_texture_full_screen;
255    bool have_sync;
256    bool pbo_readback_valid[4];
257    bool pbo_readback_enable;
258 };
259 
260 #define GL_BIND_TEXTURE(id, wrap_mode, mag_filter, min_filter) \
261    glBindTexture(GL_TEXTURE_2D, id); \
262    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_mode); \
263    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_mode); \
264    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); \
265    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter)
266 
267 bool gl_query_core_context_in_use(void);
268 
269 bool gl_load_luts(
270       const void *shader_data,
271       GLuint *textures_lut);
272 
273 RETRO_END_DECLS
274 
275 #endif
276