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