src/render/opengl/SDL_render_gl.c
author Philipp Wiesemann <philipp.wiesemann@arcor.de>
Sun, 12 May 2013 13:40:02 +0200
changeset 7169 d27e9ee7310f
parent 7161 1619292eec30
child 7171 929700967727
permissions -rw-r--r--
Fixed bug 1844 - glScissor calls are wrong - Patch attached Martin Gerhardy the coordinate system from sdl is not correctly transformed to the coordinate system of opengl. glScissor expects them to be a little bit different. Attached is a patch that fixes this
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     1
/*
5535
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
     2
  Simple DirectMedia Layer
6885
700f1b25f77f Happy New Year!
Sam Lantinga <slouken@libsdl.org>
parents: 6528
diff changeset
     3
  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     4
5535
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
     5
  This software is provided 'as-is', without any express or implied
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
     6
  warranty.  In no event will the authors be held liable for any damages
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
     7
  arising from the use of this software.
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     8
5535
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
     9
  Permission is granted to anyone to use this software for any purpose,
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
    10
  including commercial applications, and to alter it and redistribute it
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
    11
  freely, subject to the following restrictions:
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    12
5535
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
    13
  1. The origin of this software must not be misrepresented; you must not
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
    14
     claim that you wrote the original software. If you use this software
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
    15
     in a product, an acknowledgment in the product documentation would be
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
    16
     appreciated but is not required.
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
    17
  2. Altered source versions must be plainly marked as such, and must not be
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
    18
     misrepresented as being the original software.
96594ac5fd1a SDL 1.3 is now under the zlib license.
Sam Lantinga <slouken@libsdl.org>
parents: 5503
diff changeset
    19
  3. This notice may not be removed or altered from any source distribution.
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    20
*/
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    21
#include "SDL_config.h"
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    22
5226
710d00cb3a6a Made it possible to disable the rendering subsystem with configure --disable-render
Sam Lantinga <slouken@libsdl.org>
parents: 5224
diff changeset
    23
#if SDL_VIDEO_RENDER_OGL && !SDL_RENDER_DISABLED
1920
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
    24
5233
ce4f91138031 Added a hint to control whether the OpenGL driver uses shaders.
Sam Lantinga <slouken@libsdl.org>
parents: 5230
diff changeset
    25
#include "SDL_hints.h"
ce4f91138031 Added a hint to control whether the OpenGL driver uses shaders.
Sam Lantinga <slouken@libsdl.org>
parents: 5230
diff changeset
    26
#include "SDL_log.h"
1920
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
    27
#include "SDL_opengl.h"
5154
fb424691cfc7 Moved the rendering code out to a separate directory in the hope that it can someday be completely decoupled from the rest of the library and be expanded to an awesome 2D on 3D library.
Sam Lantinga <slouken@libsdl.org>
parents: 5150
diff changeset
    28
#include "../SDL_sysrender.h"
5228
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
    29
#include "SDL_shaders_gl.h"
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    30
2246
75daa0792bd1 Added code to enable multi-threaded OpenGL on Mac OS X, pending Ryan's PBO/VBO
Sam Lantinga <slouken@libsdl.org>
parents: 2237
diff changeset
    31
#ifdef __MACOSX__
75daa0792bd1 Added code to enable multi-threaded OpenGL on Mac OS X, pending Ryan's PBO/VBO
Sam Lantinga <slouken@libsdl.org>
parents: 2237
diff changeset
    32
#include <OpenGL/OpenGL.h>
75daa0792bd1 Added code to enable multi-threaded OpenGL on Mac OS X, pending Ryan's PBO/VBO
Sam Lantinga <slouken@libsdl.org>
parents: 2237
diff changeset
    33
#endif
75daa0792bd1 Added code to enable multi-threaded OpenGL on Mac OS X, pending Ryan's PBO/VBO
Sam Lantinga <slouken@libsdl.org>
parents: 2237
diff changeset
    34
2778
38dfc890ee6b Preliminary support for YUV textures
Sam Lantinga <slouken@libsdl.org>
parents: 2328
diff changeset
    35
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    36
/* OpenGL renderer implementation */
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    37
2230
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
    38
/* Details on optimizing the texture path on Mac OS X:
5203
25ffd4e5255c Minor consistency cleanup and documentation link update.
Sam Lantinga <slouken@libsdl.org>
parents: 5195
diff changeset
    39
   http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_texturedata/opengl_texturedata.html
2230
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
    40
*/
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
    41
5154
fb424691cfc7 Moved the rendering code out to a separate directory in the hope that it can someday be completely decoupled from the rest of the library and be expanded to an awesome 2D on 3D library.
Sam Lantinga <slouken@libsdl.org>
parents: 5150
diff changeset
    42
/* Used to re-create the window with OpenGL capability */
fb424691cfc7 Moved the rendering code out to a separate directory in the hope that it can someday be completely decoupled from the rest of the library and be expanded to an awesome 2D on 3D library.
Sam Lantinga <slouken@libsdl.org>
parents: 5150
diff changeset
    43
extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);
2835
f38257b5d936 Initial pixel shader support for YUV textures in the GL renderer.
Ryan C. Gordon <icculus@icculus.org>
parents: 2833
diff changeset
    44
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1975
diff changeset
    45
static const float inv255f = 1.0f / 255.0f;
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1975
diff changeset
    46
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    47
static SDL_Renderer *GL_CreateRenderer(SDL_Window * window, Uint32 flags);
5147
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
    48
static void GL_WindowEvent(SDL_Renderer * renderer,
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
    49
                           const SDL_WindowEvent *event);
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    50
static int GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    51
static int GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    52
                            const SDL_Rect * rect, const void *pixels,
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    53
                            int pitch);
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    54
static int GL_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
5156
307ccc9c135e Made it possible to create a texture of any format, even if not supported by the renderer.
Sam Lantinga <slouken@libsdl.org>
parents: 5154
diff changeset
    55
                          const SDL_Rect * rect, void **pixels, int *pitch);
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    56
static void GL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);
6247
b6212690f78d Renamed SetTargetTexture() to SetRenderTarget()
Sam Lantinga <slouken@libsdl.org>
parents: 6246
diff changeset
    57
static int GL_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture);
5297
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
    58
static int GL_UpdateViewport(SDL_Renderer * renderer);
7141
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
    59
static int GL_UpdateClipRect(SDL_Renderer * renderer);
3596
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
    60
static int GL_RenderClear(SDL_Renderer * renderer);
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
    61
static int GL_RenderDrawPoints(SDL_Renderer * renderer,
6528
e978048ced60 Added SDL_RenderSetScale() and SDL_RenderGetScale()
Sam Lantinga <slouken@libsdl.org>
parents: 6499
diff changeset
    62
                               const SDL_FPoint * points, int count);
3596
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
    63
static int GL_RenderDrawLines(SDL_Renderer * renderer,
6528
e978048ced60 Added SDL_RenderSetScale() and SDL_RenderGetScale()
Sam Lantinga <slouken@libsdl.org>
parents: 6499
diff changeset
    64
                              const SDL_FPoint * points, int count);
3596
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
    65
static int GL_RenderFillRects(SDL_Renderer * renderer,
6528
e978048ced60 Added SDL_RenderSetScale() and SDL_RenderGetScale()
Sam Lantinga <slouken@libsdl.org>
parents: 6499
diff changeset
    66
                              const SDL_FRect * rects, int count);
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    67
static int GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
6528
e978048ced60 Added SDL_RenderSetScale() and SDL_RenderGetScale()
Sam Lantinga <slouken@libsdl.org>
parents: 6499
diff changeset
    68
                         const SDL_Rect * srcrect, const SDL_FRect * dstrect);
6320
6077a1310907 RenderCopyEx,rotation and flipping for all hardware/software backends (#1308)
Gabriel Jacobo <gabomdq@gmail.com>
parents: 6260
diff changeset
    69
static int GL_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
6528
e978048ced60 Added SDL_RenderSetScale() and SDL_RenderGetScale()
Sam Lantinga <slouken@libsdl.org>
parents: 6499
diff changeset
    70
                         const SDL_Rect * srcrect, const SDL_FRect * dstrect,
e978048ced60 Added SDL_RenderSetScale() and SDL_RenderGetScale()
Sam Lantinga <slouken@libsdl.org>
parents: 6499
diff changeset
    71
                         const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip);
3431
c8fbb27627d9 Work in progress on OpenGL ReadPixels/WritePixels interface
Sam Lantinga <slouken@libsdl.org>
parents: 3393
diff changeset
    72
static int GL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
3435
9f62f47d989b You can specify the format for pixel data in SDL_RenderReadPixels() and SDL_RenderWritePixels()
Sam Lantinga <slouken@libsdl.org>
parents: 3433
diff changeset
    73
                               Uint32 pixel_format, void * pixels, int pitch);
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    74
static void GL_RenderPresent(SDL_Renderer * renderer);
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    75
static void GL_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture);
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    76
static void GL_DestroyRenderer(SDL_Renderer * renderer);
6414
df50b0d6c1c3 Implements SDL_GL_BindTexture and SDL_GL_UnbindTexture (#1576)
Gabriel Jacobo <gabomdq@gmail.com>
parents: 6320
diff changeset
    77
static int GL_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh);
df50b0d6c1c3 Implements SDL_GL_BindTexture and SDL_GL_UnbindTexture (#1576)
Gabriel Jacobo <gabomdq@gmail.com>
parents: 6320
diff changeset
    78
static int GL_UnbindTexture (SDL_Renderer * renderer, SDL_Texture *texture);
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    79
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    80
SDL_RenderDriver GL_RenderDriver = {
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    81
    GL_CreateRenderer,
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    82
    {
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    83
     "opengl",
6237
240f1bced46b Added a renderer flag to expose whether a renderer supports render to texture.
Sam Lantinga <slouken@libsdl.org>
parents: 6232
diff changeset
    84
     (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE),
5156
307ccc9c135e Made it possible to create a texture of any format, even if not supported by the renderer.
Sam Lantinga <slouken@libsdl.org>
parents: 5154
diff changeset
    85
     1,
307ccc9c135e Made it possible to create a texture of any format, even if not supported by the renderer.
Sam Lantinga <slouken@libsdl.org>
parents: 5154
diff changeset
    86
     {SDL_PIXELFORMAT_ARGB8888},
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    87
     0,
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    88
     0}
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    89
};
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    90
6232
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
    91
typedef struct GL_FBOList GL_FBOList;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
    92
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
    93
struct GL_FBOList
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
    94
{
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
    95
    Uint32 w, h;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
    96
    GLuint FBO;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
    97
    GL_FBOList *next;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
    98
};
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
    99
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   100
typedef struct
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   101
{
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   102
    SDL_GLContext context;
2233
fb01ee9716bc Test using glTextureRangeAPPLE
Sam Lantinga <slouken@libsdl.org>
parents: 2230
diff changeset
   103
    SDL_bool GL_ARB_texture_rectangle_supported;
5355
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   104
    struct {
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   105
        GL_Shader shader;
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   106
        Uint32 color;
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   107
        int blendMode;
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   108
    } current;
6232
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   109
    
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   110
    SDL_bool GL_EXT_framebuffer_object_supported;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   111
    GL_FBOList *framebuffers;
1927
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   112
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   113
    /* OpenGL functions */
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   114
#define SDL_PROC(ret,func,params) ret (APIENTRY *func) params;
5204
daa5463466c5 Fixed building on Android, added SDL_opengles2.h, removed unnecessary SDL_glesfuncs.h
Sam Lantinga <slouken@libsdl.org>
parents: 5203
diff changeset
   115
#include "SDL_glfuncs.h"
1927
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   116
#undef SDL_PROC
1974
70deaf574153 Added paletted OpenGL texture support.
Sam Lantinga <slouken@libsdl.org>
parents: 1970
diff changeset
   117
5228
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   118
    /* Multitexture support */
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   119
    SDL_bool GL_ARB_multitexture_supported;
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   120
    PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
5351
176cd91c3907 Fixed warning on Mac OS X 10.4
Sam Lantinga <slouken@libsdl.org>
parents: 5297
diff changeset
   121
    GLint num_texture_units;
6232
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   122
    
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   123
    PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   124
    PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   125
    PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   126
    PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   127
    PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
5228
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   128
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   129
    /* Shader support */
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   130
    GL_ShaderContext *shaders;
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   131
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   132
} GL_RenderData;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   133
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   134
typedef struct
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   135
{
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   136
    GLuint texture;
1920
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   137
    GLenum type;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   138
    GLfloat texw;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   139
    GLfloat texh;
1920
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   140
    GLenum format;
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   141
    GLenum formattype;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   142
    void *pixels;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   143
    int pitch;
5227
9c0c4d767ef6 Reduce duplicated code in the texture update code paths
Sam Lantinga <slouken@libsdl.org>
parents: 5226
diff changeset
   144
    SDL_Rect locked_rect;
5264
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   145
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   146
    /* YV12 texture support */
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   147
    SDL_bool yuv;
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   148
    GLuint utexture;
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   149
    GLuint vtexture;
6232
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   150
    
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   151
    GL_FBOList *fbo;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   152
} GL_TextureData;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   153
6499
a34024340f54 Patched to compile on Visual Studio.
Ryan C. Gordon <icculus@icculus.org>
parents: 6494
diff changeset
   154
static __inline__ const char*
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   155
GL_TranslateError (GLenum error)
1924
69217fdd2c0a If the OpenGL renderer is selected for a non-OpenGL window, recreate the window with OpenGL enabled.
Sam Lantinga <slouken@libsdl.org>
parents: 1923
diff changeset
   156
{
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   157
#define GL_ERROR_TRANSLATE(e) case e: return #e;
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   158
    switch (error) {
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   159
    GL_ERROR_TRANSLATE(GL_INVALID_ENUM)
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   160
    GL_ERROR_TRANSLATE(GL_INVALID_VALUE)
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   161
    GL_ERROR_TRANSLATE(GL_INVALID_OPERATION)
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   162
    GL_ERROR_TRANSLATE(GL_OUT_OF_MEMORY)
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   163
    GL_ERROR_TRANSLATE(GL_NO_ERROR)
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   164
    GL_ERROR_TRANSLATE(GL_STACK_OVERFLOW)
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   165
    GL_ERROR_TRANSLATE(GL_STACK_UNDERFLOW)
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   166
    GL_ERROR_TRANSLATE(GL_TABLE_TOO_LARGE)
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   167
    default:
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   168
        return "UNKNOWN";
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   169
}
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   170
#undef GL_ERROR_TRANSLATE
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   171
}
1924
69217fdd2c0a If the OpenGL renderer is selected for a non-OpenGL window, recreate the window with OpenGL enabled.
Sam Lantinga <slouken@libsdl.org>
parents: 1923
diff changeset
   172
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   173
static __inline__ int
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   174
GL_CheckAllErrors (const char *prefix, SDL_Renderer * renderer, const char *file, int line, const char *function)
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   175
{
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   176
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   177
    int ret = 0;
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   178
    /* check gl errors (can return multiple errors) */
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   179
    for (;;) {
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   180
        GLenum error = data->glGetError();
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   181
        if (error != GL_NO_ERROR) {
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   182
            if (prefix == NULL || prefix[0] == '\0') {
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   183
                prefix = "generic";
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   184
            }
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   185
            SDL_SetError("%s: %s (%d): %s %s (0x%X)", prefix, file, line, function, GL_TranslateError(error), error);
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   186
            ret++;
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   187
        } else {
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   188
            break;
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   189
        }
1924
69217fdd2c0a If the OpenGL renderer is selected for a non-OpenGL window, recreate the window with OpenGL enabled.
Sam Lantinga <slouken@libsdl.org>
parents: 1923
diff changeset
   190
    }
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   191
    return ret;
1924
69217fdd2c0a If the OpenGL renderer is selected for a non-OpenGL window, recreate the window with OpenGL enabled.
Sam Lantinga <slouken@libsdl.org>
parents: 1923
diff changeset
   192
}
69217fdd2c0a If the OpenGL renderer is selected for a non-OpenGL window, recreate the window with OpenGL enabled.
Sam Lantinga <slouken@libsdl.org>
parents: 1923
diff changeset
   193
6499
a34024340f54 Patched to compile on Visual Studio.
Ryan C. Gordon <icculus@icculus.org>
parents: 6494
diff changeset
   194
#if 0
a34024340f54 Patched to compile on Visual Studio.
Ryan C. Gordon <icculus@icculus.org>
parents: 6494
diff changeset
   195
#define GL_CheckError(prefix, renderer)
a34024340f54 Patched to compile on Visual Studio.
Ryan C. Gordon <icculus@icculus.org>
parents: 6494
diff changeset
   196
#elif defined(_MSC_VER)
a34024340f54 Patched to compile on Visual Studio.
Ryan C. Gordon <icculus@icculus.org>
parents: 6494
diff changeset
   197
#define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __FUNCTION__)
a34024340f54 Patched to compile on Visual Studio.
Ryan C. Gordon <icculus@icculus.org>
parents: 6494
diff changeset
   198
#else
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   199
#define GL_CheckError(prefix, renderer) GL_CheckAllErrors(prefix, renderer, __FILE__, __LINE__, __PRETTY_FUNCTION__)
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   200
#endif
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   201
1927
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   202
static int
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   203
GL_LoadFunctions(GL_RenderData * data)
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   204
{
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   205
#ifdef __SDL_NOGETPROCADDR__
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   206
#define SDL_PROC(ret,func,params) data->func=func;
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   207
#else
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   208
#define SDL_PROC(ret,func,params) \
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   209
    do { \
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   210
        data->func = SDL_GL_GetProcAddress(#func); \
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   211
        if ( ! data->func ) { \
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 6885
diff changeset
   212
            return SDL_SetError("Couldn't load GL function %s: %s\n", #func, SDL_GetError()); \
1927
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   213
        } \
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   214
    } while ( 0 );
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   215
#endif /* __SDL_NOGETPROCADDR__ */
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   216
5204
daa5463466c5 Fixed building on Android, added SDL_opengles2.h, removed unnecessary SDL_glesfuncs.h
Sam Lantinga <slouken@libsdl.org>
parents: 5203
diff changeset
   217
#include "SDL_glfuncs.h"
1927
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   218
#undef SDL_PROC
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   219
    return 0;
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   220
}
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   221
5297
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   222
static SDL_GLContext SDL_CurrentContext = NULL;
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   223
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   224
static int
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   225
GL_ActivateRenderer(SDL_Renderer * renderer)
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   226
{
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   227
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   228
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   229
    if (SDL_CurrentContext != data->context) {
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   230
        if (SDL_GL_MakeCurrent(renderer->window, data->context) < 0) {
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   231
            return -1;
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   232
        }
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   233
        SDL_CurrentContext = data->context;
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   234
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   235
        GL_UpdateViewport(renderer);
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   236
    }
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   237
    return 0;
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   238
}
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   239
5355
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   240
/* This is called if we need to invalidate all of the SDL OpenGL state */
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   241
static void
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   242
GL_ResetState(SDL_Renderer *renderer)
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   243
{
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   244
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   245
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   246
    if (SDL_CurrentContext == data->context) {
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   247
        GL_UpdateViewport(renderer);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   248
    } else {
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   249
        GL_ActivateRenderer(renderer);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   250
    }
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   251
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   252
    data->current.shader = SHADER_NONE;
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   253
    data->current.color = 0;
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   254
    data->current.blendMode = -1;
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   255
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   256
    data->glDisable(GL_DEPTH_TEST);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   257
    data->glDisable(GL_CULL_FACE);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   258
    /* This ended up causing video discrepancies between OpenGL and Direct3D */
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   259
    /*data->glEnable(GL_LINE_SMOOTH);*/
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   260
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   261
    data->glMatrixMode(GL_MODELVIEW);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   262
    data->glLoadIdentity();
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   263
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   264
    GL_CheckError("", renderer);
5355
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   265
}
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   266
6232
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   267
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   268
GL_FBOList *
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   269
GL_GetFBO(GL_RenderData *data, Uint32 w, Uint32 h)
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   270
{
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   271
    GL_FBOList *result = data->framebuffers;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   272
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   273
    while (result && ((result->w != w) || (result->h != h))) {
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   274
        result = result->next;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   275
    }
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   276
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   277
    if (!result) {
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   278
        result = SDL_malloc(sizeof(GL_FBOList));
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   279
        if (result) {
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   280
            result->w = w;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   281
            result->h = h;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   282
            data->glGenFramebuffersEXT(1, &result->FBO);
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   283
            result->next = data->framebuffers;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   284
            data->framebuffers = result;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   285
        }
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   286
    }
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   287
    return result;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   288
}
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   289
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   290
SDL_Renderer *
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   291
GL_CreateRenderer(SDL_Window * window, Uint32 flags)
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   292
{
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   293
    SDL_Renderer *renderer;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   294
    GL_RenderData *data;
5233
ce4f91138031 Added a hint to control whether the OpenGL driver uses shaders.
Sam Lantinga <slouken@libsdl.org>
parents: 5230
diff changeset
   295
    const char *hint;
1952
420716272158 Implemented X11 OpenGL support.
Sam Lantinga <slouken@libsdl.org>
parents: 1928
diff changeset
   296
    GLint value;
5154
fb424691cfc7 Moved the rendering code out to a separate directory in the hope that it can someday be completely decoupled from the rest of the library and be expanded to an awesome 2D on 3D library.
Sam Lantinga <slouken@libsdl.org>
parents: 5150
diff changeset
   297
    Uint32 window_flags;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   298
5154
fb424691cfc7 Moved the rendering code out to a separate directory in the hope that it can someday be completely decoupled from the rest of the library and be expanded to an awesome 2D on 3D library.
Sam Lantinga <slouken@libsdl.org>
parents: 5150
diff changeset
   299
    window_flags = SDL_GetWindowFlags(window);
fb424691cfc7 Moved the rendering code out to a separate directory in the hope that it can someday be completely decoupled from the rest of the library and be expanded to an awesome 2D on 3D library.
Sam Lantinga <slouken@libsdl.org>
parents: 5150
diff changeset
   300
    if (!(window_flags & SDL_WINDOW_OPENGL)) {
fb424691cfc7 Moved the rendering code out to a separate directory in the hope that it can someday be completely decoupled from the rest of the library and be expanded to an awesome 2D on 3D library.
Sam Lantinga <slouken@libsdl.org>
parents: 5150
diff changeset
   301
        if (SDL_RecreateWindow(window, window_flags | SDL_WINDOW_OPENGL) < 0) {
6182
eb6796f3e598 Fixed crash if the rendering system couldn't create an OpenGL window.
Sam Lantinga <slouken@libsdl.org>
parents: 6171
diff changeset
   302
            /* Uh oh, better try to put it back... */
eb6796f3e598 Fixed crash if the rendering system couldn't create an OpenGL window.
Sam Lantinga <slouken@libsdl.org>
parents: 6171
diff changeset
   303
            SDL_RecreateWindow(window, window_flags);
1924
69217fdd2c0a If the OpenGL renderer is selected for a non-OpenGL window, recreate the window with OpenGL enabled.
Sam Lantinga <slouken@libsdl.org>
parents: 1923
diff changeset
   304
            return NULL;
69217fdd2c0a If the OpenGL renderer is selected for a non-OpenGL window, recreate the window with OpenGL enabled.
Sam Lantinga <slouken@libsdl.org>
parents: 1923
diff changeset
   305
        }
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   306
    }
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   307
1920
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   308
    renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   309
    if (!renderer) {
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   310
        SDL_OutOfMemory();
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   311
        return NULL;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   312
    }
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   313
1920
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   314
    data = (GL_RenderData *) SDL_calloc(1, sizeof(*data));
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   315
    if (!data) {
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   316
        GL_DestroyRenderer(renderer);
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   317
        SDL_OutOfMemory();
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   318
        return NULL;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   319
    }
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   320
5147
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
   321
    renderer->WindowEvent = GL_WindowEvent;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   322
    renderer->CreateTexture = GL_CreateTexture;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   323
    renderer->UpdateTexture = GL_UpdateTexture;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   324
    renderer->LockTexture = GL_LockTexture;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   325
    renderer->UnlockTexture = GL_UnlockTexture;
6247
b6212690f78d Renamed SetTargetTexture() to SetRenderTarget()
Sam Lantinga <slouken@libsdl.org>
parents: 6246
diff changeset
   326
    renderer->SetRenderTarget = GL_SetRenderTarget;
5297
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   327
    renderer->UpdateViewport = GL_UpdateViewport;
7141
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   328
    renderer->UpdateClipRect = GL_UpdateClipRect;
3596
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   329
    renderer->RenderClear = GL_RenderClear;
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   330
    renderer->RenderDrawPoints = GL_RenderDrawPoints;
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   331
    renderer->RenderDrawLines = GL_RenderDrawLines;
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   332
    renderer->RenderFillRects = GL_RenderFillRects;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   333
    renderer->RenderCopy = GL_RenderCopy;
6320
6077a1310907 RenderCopyEx,rotation and flipping for all hardware/software backends (#1308)
Gabriel Jacobo <gabomdq@gmail.com>
parents: 6260
diff changeset
   334
    renderer->RenderCopyEx = GL_RenderCopyEx;
3431
c8fbb27627d9 Work in progress on OpenGL ReadPixels/WritePixels interface
Sam Lantinga <slouken@libsdl.org>
parents: 3393
diff changeset
   335
    renderer->RenderReadPixels = GL_RenderReadPixels;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   336
    renderer->RenderPresent = GL_RenderPresent;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   337
    renderer->DestroyTexture = GL_DestroyTexture;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   338
    renderer->DestroyRenderer = GL_DestroyRenderer;
6414
df50b0d6c1c3 Implements SDL_GL_BindTexture and SDL_GL_UnbindTexture (#1576)
Gabriel Jacobo <gabomdq@gmail.com>
parents: 6320
diff changeset
   339
    renderer->GL_BindTexture = GL_BindTexture;
df50b0d6c1c3 Implements SDL_GL_BindTexture and SDL_GL_UnbindTexture (#1576)
Gabriel Jacobo <gabomdq@gmail.com>
parents: 6320
diff changeset
   340
    renderer->GL_UnbindTexture = GL_UnbindTexture;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   341
    renderer->info = GL_RenderDriver.info;
6246
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   342
    renderer->info.flags = SDL_RENDERER_ACCELERATED;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   343
    renderer->driverdata = data;
6171
7b9126fde949 Fixed bug 1256 - Invalid window warning in GL_CreateRenderer
Sam Lantinga <slouken@libsdl.org>
parents: 6138
diff changeset
   344
    renderer->window = window;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   345
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3607
diff changeset
   346
    data->context = SDL_GL_CreateContext(window);
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   347
    if (!data->context) {
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   348
        GL_DestroyRenderer(renderer);
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   349
        return NULL;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   350
    }
3685
64ce267332c6 Switched from SDL_WindowID and SDL_TextureID to SDL_Window* and SDL_Texture* for code simplicity and improved performance.
Sam Lantinga <slouken@libsdl.org>
parents: 3607
diff changeset
   351
    if (SDL_GL_MakeCurrent(window, data->context) < 0) {
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   352
        GL_DestroyRenderer(renderer);
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   353
        return NULL;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   354
    }
5204
daa5463466c5 Fixed building on Android, added SDL_opengles2.h, removed unnecessary SDL_glesfuncs.h
Sam Lantinga <slouken@libsdl.org>
parents: 5203
diff changeset
   355
daa5463466c5 Fixed building on Android, added SDL_opengles2.h, removed unnecessary SDL_glesfuncs.h
Sam Lantinga <slouken@libsdl.org>
parents: 5203
diff changeset
   356
    if (GL_LoadFunctions(data) < 0) {
daa5463466c5 Fixed building on Android, added SDL_opengles2.h, removed unnecessary SDL_glesfuncs.h
Sam Lantinga <slouken@libsdl.org>
parents: 5203
diff changeset
   357
        GL_DestroyRenderer(renderer);
daa5463466c5 Fixed building on Android, added SDL_opengles2.h, removed unnecessary SDL_glesfuncs.h
Sam Lantinga <slouken@libsdl.org>
parents: 5203
diff changeset
   358
        return NULL;
daa5463466c5 Fixed building on Android, added SDL_opengles2.h, removed unnecessary SDL_glesfuncs.h
Sam Lantinga <slouken@libsdl.org>
parents: 5203
diff changeset
   359
    }
daa5463466c5 Fixed building on Android, added SDL_opengles2.h, removed unnecessary SDL_glesfuncs.h
Sam Lantinga <slouken@libsdl.org>
parents: 5203
diff changeset
   360
2246
75daa0792bd1 Added code to enable multi-threaded OpenGL on Mac OS X, pending Ryan's PBO/VBO
Sam Lantinga <slouken@libsdl.org>
parents: 2237
diff changeset
   361
#ifdef __MACOSX__
75daa0792bd1 Added code to enable multi-threaded OpenGL on Mac OS X, pending Ryan's PBO/VBO
Sam Lantinga <slouken@libsdl.org>
parents: 2237
diff changeset
   362
    /* Enable multi-threaded rendering */
75daa0792bd1 Added code to enable multi-threaded OpenGL on Mac OS X, pending Ryan's PBO/VBO
Sam Lantinga <slouken@libsdl.org>
parents: 2237
diff changeset
   363
    /* Disabled until Ryan finishes his VBO/PBO code...
2295
dbc6d1893869 Checking in Christian Walther's patch for x11 keyboard input. Minor code tweaks by Bob.
Bob Pendleton <bob@pendleton.com>
parents: 2275
diff changeset
   364
       CGLEnable(CGLGetCurrentContext(), kCGLCEMPEngine);
dbc6d1893869 Checking in Christian Walther's patch for x11 keyboard input. Minor code tweaks by Bob.
Bob Pendleton <bob@pendleton.com>
parents: 2275
diff changeset
   365
     */
2246
75daa0792bd1 Added code to enable multi-threaded OpenGL on Mac OS X, pending Ryan's PBO/VBO
Sam Lantinga <slouken@libsdl.org>
parents: 2237
diff changeset
   366
#endif
75daa0792bd1 Added code to enable multi-threaded OpenGL on Mac OS X, pending Ryan's PBO/VBO
Sam Lantinga <slouken@libsdl.org>
parents: 2237
diff changeset
   367
1965
a788656ca29a SDL constants are all uppercase.
Sam Lantinga <slouken@libsdl.org>
parents: 1952
diff changeset
   368
    if (flags & SDL_RENDERER_PRESENTVSYNC) {
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   369
        SDL_GL_SetSwapInterval(1);
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   370
    } else {
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   371
        SDL_GL_SetSwapInterval(0);
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   372
    }
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   373
    if (SDL_GL_GetSwapInterval() > 0) {
1965
a788656ca29a SDL constants are all uppercase.
Sam Lantinga <slouken@libsdl.org>
parents: 1952
diff changeset
   374
        renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   375
    }
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   376
1926
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
   377
    if (SDL_GL_ExtensionSupported("GL_ARB_texture_rectangle")
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
   378
        || SDL_GL_ExtensionSupported("GL_EXT_texture_rectangle")) {
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
   379
        data->GL_ARB_texture_rectangle_supported = SDL_TRUE;
6449
fa00544b1374 Fixed bug 1591 - Renderer maximum texture size is incorrect when GL_ARB_texture_rectangle is active
Sam Lantinga <slouken@libsdl.org>
parents: 6414
diff changeset
   380
        data->glGetIntegerv(GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB, &value);
fa00544b1374 Fixed bug 1591 - Renderer maximum texture size is incorrect when GL_ARB_texture_rectangle is active
Sam Lantinga <slouken@libsdl.org>
parents: 6414
diff changeset
   381
        renderer->info.max_texture_width = value;
fa00544b1374 Fixed bug 1591 - Renderer maximum texture size is incorrect when GL_ARB_texture_rectangle is active
Sam Lantinga <slouken@libsdl.org>
parents: 6414
diff changeset
   382
        renderer->info.max_texture_height = value;
fa00544b1374 Fixed bug 1591 - Renderer maximum texture size is incorrect when GL_ARB_texture_rectangle is active
Sam Lantinga <slouken@libsdl.org>
parents: 6414
diff changeset
   383
    } else {
fa00544b1374 Fixed bug 1591 - Renderer maximum texture size is incorrect when GL_ARB_texture_rectangle is active
Sam Lantinga <slouken@libsdl.org>
parents: 6414
diff changeset
   384
        data->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &value);
fa00544b1374 Fixed bug 1591 - Renderer maximum texture size is incorrect when GL_ARB_texture_rectangle is active
Sam Lantinga <slouken@libsdl.org>
parents: 6414
diff changeset
   385
        renderer->info.max_texture_width = value;
fa00544b1374 Fixed bug 1591 - Renderer maximum texture size is incorrect when GL_ARB_texture_rectangle is active
Sam Lantinga <slouken@libsdl.org>
parents: 6414
diff changeset
   386
        renderer->info.max_texture_height = value;
1926
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
   387
    }
1920
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   388
5228
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   389
    /* Check for multitexture support */
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   390
    if (SDL_GL_ExtensionSupported("GL_ARB_multitexture")) {
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   391
        data->glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) SDL_GL_GetProcAddress("glActiveTextureARB");
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   392
        if (data->glActiveTextureARB) {
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   393
            data->GL_ARB_multitexture_supported = SDL_TRUE;
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   394
            data->glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &data->num_texture_units);
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   395
        }
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   396
    }
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   397
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   398
    /* Check for shader support */
5233
ce4f91138031 Added a hint to control whether the OpenGL driver uses shaders.
Sam Lantinga <slouken@libsdl.org>
parents: 5230
diff changeset
   399
    hint = SDL_GetHint(SDL_HINT_RENDER_OPENGL_SHADERS);
ce4f91138031 Added a hint to control whether the OpenGL driver uses shaders.
Sam Lantinga <slouken@libsdl.org>
parents: 5230
diff changeset
   400
    if (!hint || *hint != '0') {
ce4f91138031 Added a hint to control whether the OpenGL driver uses shaders.
Sam Lantinga <slouken@libsdl.org>
parents: 5230
diff changeset
   401
        data->shaders = GL_CreateShaderContext();
ce4f91138031 Added a hint to control whether the OpenGL driver uses shaders.
Sam Lantinga <slouken@libsdl.org>
parents: 5230
diff changeset
   402
    }
ce4f91138031 Added a hint to control whether the OpenGL driver uses shaders.
Sam Lantinga <slouken@libsdl.org>
parents: 5230
diff changeset
   403
    SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, "OpenGL shaders: %s",
ce4f91138031 Added a hint to control whether the OpenGL driver uses shaders.
Sam Lantinga <slouken@libsdl.org>
parents: 5230
diff changeset
   404
                data->shaders ? "ENABLED" : "DISABLED");
5228
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   405
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   406
    /* We support YV12 textures using 3 textures and a shader */
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   407
    if (data->shaders && data->num_texture_units >= 3) {
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   408
        renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_YV12;
5264
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   409
        renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_IYUV;
5228
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   410
    }
6232
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   411
    
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   412
    if (SDL_GL_ExtensionSupported("GL_EXT_framebuffer_object")) {
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   413
        data->GL_EXT_framebuffer_object_supported = SDL_TRUE;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   414
        data->glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   415
            SDL_GL_GetProcAddress("glGenFramebuffersEXT");
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   416
        data->glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   417
            SDL_GL_GetProcAddress("glDeleteFramebuffersEXT");
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   418
        data->glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   419
            SDL_GL_GetProcAddress("glFramebufferTexture2DEXT");
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   420
        data->glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   421
            SDL_GL_GetProcAddress("glBindFramebufferEXT");
6246
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   422
        data->glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)
6232
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   423
            SDL_GL_GetProcAddress("glCheckFramebufferStatusEXT");
6246
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   424
        renderer->info.flags |= SDL_RENDERER_TARGETTEXTURE;
6232
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   425
    }
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   426
    data->framebuffers = NULL;
5228
811beeb698f9 Beginning of a framework for OpenGL shaders
Sam Lantinga <slouken@libsdl.org>
parents: 5227
diff changeset
   427
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   428
    /* Set up parameters for rendering */
5355
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   429
    GL_ResetState(renderer);
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   430
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   431
    return renderer;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   432
}
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   433
5147
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
   434
static void
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
   435
GL_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
1970
db3ba6c0d0df Allow the render context to do necessary work when the video mode changes.
Sam Lantinga <slouken@libsdl.org>
parents: 1965
diff changeset
   436
{
6260
fd494c5f305b Fixed loading textures when the window starts hidden.
Sam Lantinga <slouken@libsdl.org>
parents: 6247
diff changeset
   437
    if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED ||
fd494c5f305b Fixed loading textures when the window starts hidden.
Sam Lantinga <slouken@libsdl.org>
parents: 6247
diff changeset
   438
        event->event == SDL_WINDOWEVENT_SHOWN ||
fd494c5f305b Fixed loading textures when the window starts hidden.
Sam Lantinga <slouken@libsdl.org>
parents: 6247
diff changeset
   439
        event->event == SDL_WINDOWEVENT_HIDDEN) {
5147
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
   440
        /* Rebind the context to the window area and update matrices */
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
   441
        SDL_CurrentContext = NULL;
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
   442
    }
1923
d4572b97b08f Switch OpenGL contexts when switching render contexts.
Sam Lantinga <slouken@libsdl.org>
parents: 1922
diff changeset
   443
}
d4572b97b08f Switch OpenGL contexts when switching render contexts.
Sam Lantinga <slouken@libsdl.org>
parents: 1922
diff changeset
   444
1922
4905cac7a4bd Fixed OpenGL blend modes, added power of 2 texture code
Sam Lantinga <slouken@libsdl.org>
parents: 1921
diff changeset
   445
static __inline__ int
4905cac7a4bd Fixed OpenGL blend modes, added power of 2 texture code
Sam Lantinga <slouken@libsdl.org>
parents: 1921
diff changeset
   446
power_of_2(int input)
4905cac7a4bd Fixed OpenGL blend modes, added power of 2 texture code
Sam Lantinga <slouken@libsdl.org>
parents: 1921
diff changeset
   447
{
4905cac7a4bd Fixed OpenGL blend modes, added power of 2 texture code
Sam Lantinga <slouken@libsdl.org>
parents: 1921
diff changeset
   448
    int value = 1;
4905cac7a4bd Fixed OpenGL blend modes, added power of 2 texture code
Sam Lantinga <slouken@libsdl.org>
parents: 1921
diff changeset
   449
4905cac7a4bd Fixed OpenGL blend modes, added power of 2 texture code
Sam Lantinga <slouken@libsdl.org>
parents: 1921
diff changeset
   450
    while (value < input) {
4905cac7a4bd Fixed OpenGL blend modes, added power of 2 texture code
Sam Lantinga <slouken@libsdl.org>
parents: 1921
diff changeset
   451
        value <<= 1;
4905cac7a4bd Fixed OpenGL blend modes, added power of 2 texture code
Sam Lantinga <slouken@libsdl.org>
parents: 1921
diff changeset
   452
    }
4905cac7a4bd Fixed OpenGL blend modes, added power of 2 texture code
Sam Lantinga <slouken@libsdl.org>
parents: 1921
diff changeset
   453
    return value;
4905cac7a4bd Fixed OpenGL blend modes, added power of 2 texture code
Sam Lantinga <slouken@libsdl.org>
parents: 1921
diff changeset
   454
}
4905cac7a4bd Fixed OpenGL blend modes, added power of 2 texture code
Sam Lantinga <slouken@libsdl.org>
parents: 1921
diff changeset
   455
3433
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   456
static __inline__ SDL_bool
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   457
convert_format(GL_RenderData *renderdata, Uint32 pixel_format,
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   458
               GLint* internalFormat, GLenum* format, GLenum* type)
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   459
{
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   460
    switch (pixel_format) {
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   461
    case SDL_PIXELFORMAT_ARGB8888:
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   462
        *internalFormat = GL_RGBA8;
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   463
        *format = GL_BGRA;
5156
307ccc9c135e Made it possible to create a texture of any format, even if not supported by the renderer.
Sam Lantinga <slouken@libsdl.org>
parents: 5154
diff changeset
   464
        *type = GL_UNSIGNED_INT_8_8_8_8_REV;
3433
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   465
        break;
5264
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   466
    case SDL_PIXELFORMAT_YV12:
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   467
    case SDL_PIXELFORMAT_IYUV:
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   468
        *internalFormat = GL_LUMINANCE;
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   469
        *format = GL_LUMINANCE;
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   470
        *type = GL_UNSIGNED_BYTE;
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   471
        break;
3433
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   472
    default:
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   473
        return SDL_FALSE;
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   474
    }
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   475
    return SDL_TRUE;
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   476
}
2835
f38257b5d936 Initial pixel shader support for YUV textures in the GL renderer.
Ryan C. Gordon <icculus@icculus.org>
parents: 2833
diff changeset
   477
5484
e20c93bc9122 Added the SDL_HINT_RENDER_SCALE_QUALITY hint, which defaults to nearest pixel sampling.
Sam Lantinga <slouken@libsdl.org>
parents: 5465
diff changeset
   478
static GLenum
e20c93bc9122 Added the SDL_HINT_RENDER_SCALE_QUALITY hint, which defaults to nearest pixel sampling.
Sam Lantinga <slouken@libsdl.org>
parents: 5465
diff changeset
   479
GetScaleQuality(void)
e20c93bc9122 Added the SDL_HINT_RENDER_SCALE_QUALITY hint, which defaults to nearest pixel sampling.
Sam Lantinga <slouken@libsdl.org>
parents: 5465
diff changeset
   480
{
e20c93bc9122 Added the SDL_HINT_RENDER_SCALE_QUALITY hint, which defaults to nearest pixel sampling.
Sam Lantinga <slouken@libsdl.org>
parents: 5465
diff changeset
   481
    const char *hint = SDL_GetHint(SDL_HINT_RENDER_SCALE_QUALITY);
e20c93bc9122 Added the SDL_HINT_RENDER_SCALE_QUALITY hint, which defaults to nearest pixel sampling.
Sam Lantinga <slouken@libsdl.org>
parents: 5465
diff changeset
   482
e20c93bc9122 Added the SDL_HINT_RENDER_SCALE_QUALITY hint, which defaults to nearest pixel sampling.
Sam Lantinga <slouken@libsdl.org>
parents: 5465
diff changeset
   483
    if (!hint || *hint == '0' || SDL_strcasecmp(hint, "nearest") == 0) {
e20c93bc9122 Added the SDL_HINT_RENDER_SCALE_QUALITY hint, which defaults to nearest pixel sampling.
Sam Lantinga <slouken@libsdl.org>
parents: 5465
diff changeset
   484
        return GL_NEAREST;
e20c93bc9122 Added the SDL_HINT_RENDER_SCALE_QUALITY hint, which defaults to nearest pixel sampling.
Sam Lantinga <slouken@libsdl.org>
parents: 5465
diff changeset
   485
    } else {
e20c93bc9122 Added the SDL_HINT_RENDER_SCALE_QUALITY hint, which defaults to nearest pixel sampling.
Sam Lantinga <slouken@libsdl.org>
parents: 5465
diff changeset
   486
        return GL_LINEAR;
e20c93bc9122 Added the SDL_HINT_RENDER_SCALE_QUALITY hint, which defaults to nearest pixel sampling.
Sam Lantinga <slouken@libsdl.org>
parents: 5465
diff changeset
   487
    }
e20c93bc9122 Added the SDL_HINT_RENDER_SCALE_QUALITY hint, which defaults to nearest pixel sampling.
Sam Lantinga <slouken@libsdl.org>
parents: 5465
diff changeset
   488
}
e20c93bc9122 Added the SDL_HINT_RENDER_SCALE_QUALITY hint, which defaults to nearest pixel sampling.
Sam Lantinga <slouken@libsdl.org>
parents: 5465
diff changeset
   489
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   490
static int
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   491
GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   492
{
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   493
    GL_RenderData *renderdata = (GL_RenderData *) renderer->driverdata;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   494
    GL_TextureData *data;
1920
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   495
    GLint internalFormat;
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   496
    GLenum format, type;
1922
4905cac7a4bd Fixed OpenGL blend modes, added power of 2 texture code
Sam Lantinga <slouken@libsdl.org>
parents: 1921
diff changeset
   497
    int texture_w, texture_h;
5503
be88d105e91c The scale mode is per texture, not per texture unit.
Sam Lantinga <slouken@libsdl.org>
parents: 5484
diff changeset
   498
    GLenum scaleMode;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   499
5147
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
   500
    GL_ActivateRenderer(renderer);
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
   501
3433
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   502
    if (!convert_format(renderdata, texture->format, &internalFormat,
ad845d9835aa Hmm, this isn't going to work, is it?
Sam Lantinga <slouken@libsdl.org>
parents: 3431
diff changeset
   503
                        &format, &type)) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 6885
diff changeset
   504
        return SDL_SetError("Texture format %s not supported by OpenGL",
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 6885
diff changeset
   505
                            SDL_GetPixelFormatName(texture->format));
1920
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   506
    }
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   507
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   508
    data = (GL_TextureData *) SDL_calloc(1, sizeof(*data));
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   509
    if (!data) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 6885
diff changeset
   510
        return SDL_OutOfMemory();
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   511
    }
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   512
2222
926294b2bb4e Emphasized the separation between SDL_Surface and SDL_Texture
Sam Lantinga <slouken@libsdl.org>
parents: 1986
diff changeset
   513
    if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
5264
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   514
        size_t size;
5156
307ccc9c135e Made it possible to create a texture of any format, even if not supported by the renderer.
Sam Lantinga <slouken@libsdl.org>
parents: 5154
diff changeset
   515
        data->pitch = texture->w * SDL_BYTESPERPIXEL(texture->format);
5264
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   516
        size = texture->h * data->pitch;
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   517
        if (texture->format == SDL_PIXELFORMAT_YV12 ||
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   518
            texture->format == SDL_PIXELFORMAT_IYUV) {
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   519
            /* Need to add size for the U and V planes */
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   520
            size += (2 * (texture->h * data->pitch) / 4);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   521
        }
5402
5d102cd8aef3 Zero streaming textures at the driver level
Sam Lantinga <slouken@libsdl.org>
parents: 5397
diff changeset
   522
        data->pixels = SDL_calloc(1, size);
2222
926294b2bb4e Emphasized the separation between SDL_Surface and SDL_Texture
Sam Lantinga <slouken@libsdl.org>
parents: 1986
diff changeset
   523
        if (!data->pixels) {
926294b2bb4e Emphasized the separation between SDL_Surface and SDL_Texture
Sam Lantinga <slouken@libsdl.org>
parents: 1986
diff changeset
   524
            SDL_free(data);
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 6885
diff changeset
   525
            return SDL_OutOfMemory();
2222
926294b2bb4e Emphasized the separation between SDL_Surface and SDL_Texture
Sam Lantinga <slouken@libsdl.org>
parents: 1986
diff changeset
   526
        }
926294b2bb4e Emphasized the separation between SDL_Surface and SDL_Texture
Sam Lantinga <slouken@libsdl.org>
parents: 1986
diff changeset
   527
    }
926294b2bb4e Emphasized the separation between SDL_Surface and SDL_Texture
Sam Lantinga <slouken@libsdl.org>
parents: 1986
diff changeset
   528
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   529
    texture->driverdata = data;
6232
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   530
    
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   531
    if (texture->access == SDL_TEXTUREACCESS_TARGET) {
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   532
        data->fbo = GL_GetFBO(renderdata, texture->w, texture->h);
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   533
    } else {
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   534
        data->fbo = NULL;
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   535
    }
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   536
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   537
    GL_CheckError("", renderer);
1927
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   538
    renderdata->glGenTextures(1, &data->texture);
6232
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   539
    if ((renderdata->GL_ARB_texture_rectangle_supported)
37e8d0736366 Implementation of render targets, by Mason Wheeler and Gabriel Jacobo
Sam Lantinga <slouken@libsdl.org>
parents: 6207
diff changeset
   540
        /*&& texture->access != SDL_TEXTUREACCESS_TARGET*/){
1926
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
   541
        data->type = GL_TEXTURE_RECTANGLE_ARB;
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
   542
        texture_w = texture->w;
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
   543
        texture_h = texture->h;
2835
f38257b5d936 Initial pixel shader support for YUV textures in the GL renderer.
Ryan C. Gordon <icculus@icculus.org>
parents: 2833
diff changeset
   544
        data->texw = (GLfloat) texture_w;
f38257b5d936 Initial pixel shader support for YUV textures in the GL renderer.
Ryan C. Gordon <icculus@icculus.org>
parents: 2833
diff changeset
   545
        data->texh = (GLfloat) texture_h;
1926
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
   546
    } else {
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
   547
        data->type = GL_TEXTURE_2D;
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
   548
        texture_w = power_of_2(texture->w);
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
   549
        texture_h = power_of_2(texture->h);
2835
f38257b5d936 Initial pixel shader support for YUV textures in the GL renderer.
Ryan C. Gordon <icculus@icculus.org>
parents: 2833
diff changeset
   550
        data->texw = (GLfloat) (texture->w) / texture_w;
1926
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
   551
        data->texh = (GLfloat) texture->h / texture_h;
307355678142 Added SDL_GL_ExtensionSupported()
Sam Lantinga <slouken@libsdl.org>
parents: 1924
diff changeset
   552
    }
2835
f38257b5d936 Initial pixel shader support for YUV textures in the GL renderer.
Ryan C. Gordon <icculus@icculus.org>
parents: 2833
diff changeset
   553
1920
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   554
    data->format = format;
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   555
    data->formattype = type;
5503
be88d105e91c The scale mode is per texture, not per texture unit.
Sam Lantinga <slouken@libsdl.org>
parents: 5484
diff changeset
   556
    scaleMode = GetScaleQuality();
2884
9dde605c7540 Date: Fri, 19 Dec 2008 20:17:35 +0100
Sam Lantinga <slouken@libsdl.org>
parents: 2858
diff changeset
   557
    renderdata->glEnable(data->type);
1927
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   558
    renderdata->glBindTexture(data->type, data->texture);
5503
be88d105e91c The scale mode is per texture, not per texture unit.
Sam Lantinga <slouken@libsdl.org>
parents: 5484
diff changeset
   559
    renderdata->glTexParameteri(data->type, GL_TEXTURE_MIN_FILTER, scaleMode);
be88d105e91c The scale mode is per texture, not per texture unit.
Sam Lantinga <slouken@libsdl.org>
parents: 5484
diff changeset
   560
    renderdata->glTexParameteri(data->type, GL_TEXTURE_MAG_FILTER, scaleMode);
6207
15ff38383cb7 Fixed bug 1331 - SDL_CreateTextureFromSurface fails for OpenGL + Win XP 64 NVidia 285.58 with GL_INVALID_ENUM
Sam Lantinga <slouken@libsdl.org>
parents: 6182
diff changeset
   561
    /* According to the spec, CLAMP_TO_EDGE is the default for TEXTURE_RECTANGLE
15ff38383cb7 Fixed bug 1331 - SDL_CreateTextureFromSurface fails for OpenGL + Win XP 64 NVidia 285.58 with GL_INVALID_ENUM
Sam Lantinga <slouken@libsdl.org>
parents: 6182
diff changeset
   562
       and setting it causes an INVALID_ENUM error in the latest NVidia drivers.
15ff38383cb7 Fixed bug 1331 - SDL_CreateTextureFromSurface fails for OpenGL + Win XP 64 NVidia 285.58 with GL_INVALID_ENUM
Sam Lantinga <slouken@libsdl.org>
parents: 6182
diff changeset
   563
    */
15ff38383cb7 Fixed bug 1331 - SDL_CreateTextureFromSurface fails for OpenGL + Win XP 64 NVidia 285.58 with GL_INVALID_ENUM
Sam Lantinga <slouken@libsdl.org>
parents: 6182
diff changeset
   564
    if (data->type != GL_TEXTURE_RECTANGLE_ARB) {
15ff38383cb7 Fixed bug 1331 - SDL_CreateTextureFromSurface fails for OpenGL + Win XP 64 NVidia 285.58 with GL_INVALID_ENUM
Sam Lantinga <slouken@libsdl.org>
parents: 6182
diff changeset
   565
        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_S,
15ff38383cb7 Fixed bug 1331 - SDL_CreateTextureFromSurface fails for OpenGL + Win XP 64 NVidia 285.58 with GL_INVALID_ENUM
Sam Lantinga <slouken@libsdl.org>
parents: 6182
diff changeset
   566
                                    GL_CLAMP_TO_EDGE);
15ff38383cb7 Fixed bug 1331 - SDL_CreateTextureFromSurface fails for OpenGL + Win XP 64 NVidia 285.58 with GL_INVALID_ENUM
Sam Lantinga <slouken@libsdl.org>
parents: 6182
diff changeset
   567
        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_T,
15ff38383cb7 Fixed bug 1331 - SDL_CreateTextureFromSurface fails for OpenGL + Win XP 64 NVidia 285.58 with GL_INVALID_ENUM
Sam Lantinga <slouken@libsdl.org>
parents: 6182
diff changeset
   568
                                    GL_CLAMP_TO_EDGE);
15ff38383cb7 Fixed bug 1331 - SDL_CreateTextureFromSurface fails for OpenGL + Win XP 64 NVidia 285.58 with GL_INVALID_ENUM
Sam Lantinga <slouken@libsdl.org>
parents: 6182
diff changeset
   569
    }
2840
53ca0d758b0a The previous checkin fixes the crash, so at least we're not overrunning
Sam Lantinga <slouken@libsdl.org>
parents: 2839
diff changeset
   570
#ifdef __MACOSX__
2230
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   571
#ifndef GL_TEXTURE_STORAGE_HINT_APPLE
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   572
#define GL_TEXTURE_STORAGE_HINT_APPLE       0x85BC
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   573
#endif
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   574
#ifndef STORAGE_CACHED_APPLE
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   575
#define STORAGE_CACHED_APPLE                0x85BE
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   576
#endif
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   577
#ifndef STORAGE_SHARED_APPLE
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   578
#define STORAGE_SHARED_APPLE                0x85BF
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   579
#endif
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   580
    if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   581
        renderdata->glTexParameteri(data->type, GL_TEXTURE_STORAGE_HINT_APPLE,
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   582
                                    GL_STORAGE_SHARED_APPLE);
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   583
    } else {
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   584
        renderdata->glTexParameteri(data->type, GL_TEXTURE_STORAGE_HINT_APPLE,
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   585
                                    GL_STORAGE_CACHED_APPLE);
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   586
    }
2295
dbc6d1893869 Checking in Christian Walther's patch for x11 keyboard input. Minor code tweaks by Bob.
Bob Pendleton <bob@pendleton.com>
parents: 2275
diff changeset
   587
    if (texture->access == SDL_TEXTUREACCESS_STREAMING
5397
88ff1f463134 Hopefully fixed crashes when creating multiple streaming textures of different sizes.
Sam Lantinga <slouken@libsdl.org>
parents: 5381
diff changeset
   588
        && texture->format == SDL_PIXELFORMAT_ARGB8888
88ff1f463134 Hopefully fixed crashes when creating multiple streaming textures of different sizes.
Sam Lantinga <slouken@libsdl.org>
parents: 5381
diff changeset
   589
        && (texture->w % 8) == 0) {
2230
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   590
        renderdata->glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
5397
88ff1f463134 Hopefully fixed crashes when creating multiple streaming textures of different sizes.
Sam Lantinga <slouken@libsdl.org>
parents: 5381
diff changeset
   591
        renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
88ff1f463134 Hopefully fixed crashes when creating multiple streaming textures of different sizes.
Sam Lantinga <slouken@libsdl.org>
parents: 5381
diff changeset
   592
        renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH,
88ff1f463134 Hopefully fixed crashes when creating multiple streaming textures of different sizes.
Sam Lantinga <slouken@libsdl.org>
parents: 5381
diff changeset
   593
                          (data->pitch / SDL_BYTESPERPIXEL(texture->format)));
2230
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   594
        renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w,
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   595
                                 texture_h, 0, format, type, data->pixels);
5397
88ff1f463134 Hopefully fixed crashes when creating multiple streaming textures of different sizes.
Sam Lantinga <slouken@libsdl.org>
parents: 5381
diff changeset
   596
        renderdata->glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE);
5156
307ccc9c135e Made it possible to create a texture of any format, even if not supported by the renderer.
Sam Lantinga <slouken@libsdl.org>
parents: 5154
diff changeset
   597
    }
307ccc9c135e Made it possible to create a texture of any format, even if not supported by the renderer.
Sam Lantinga <slouken@libsdl.org>
parents: 5154
diff changeset
   598
    else
2809
7e257c3a3bf0 Temporary fix for Mac OS X crash in textoverlay
Sam Lantinga <slouken@libsdl.org>
parents: 2808
diff changeset
   599
#endif
2230
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   600
    {
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   601
        renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w,
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   602
                                 texture_h, 0, format, type, NULL);
9b7d29d2432b Optimized OpenGL renderer for Mac OS X.
Sam Lantinga <slouken@libsdl.org>
parents: 2222
diff changeset
   603
    }
3041
20d65430e63c Fixed OpenGL state issue reported by Dmytro Bogovych
Sam Lantinga <slouken@libsdl.org>
parents: 3013
diff changeset
   604
    renderdata->glDisable(data->type);
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   605
    if (GL_CheckError("glTexImage2D()", renderer) > 0) {
1924
69217fdd2c0a If the OpenGL renderer is selected for a non-OpenGL window, recreate the window with OpenGL enabled.
Sam Lantinga <slouken@libsdl.org>
parents: 1923
diff changeset
   606
        return -1;
69217fdd2c0a If the OpenGL renderer is selected for a non-OpenGL window, recreate the window with OpenGL enabled.
Sam Lantinga <slouken@libsdl.org>
parents: 1923
diff changeset
   607
    }
5264
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   608
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   609
    if (texture->format == SDL_PIXELFORMAT_YV12 ||
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   610
        texture->format == SDL_PIXELFORMAT_IYUV) {
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   611
        data->yuv = SDL_TRUE;
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   612
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   613
        renderdata->glGenTextures(1, &data->utexture);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   614
        renderdata->glGenTextures(1, &data->vtexture);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   615
        renderdata->glEnable(data->type);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   616
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   617
        renderdata->glBindTexture(data->type, data->utexture);
5503
be88d105e91c The scale mode is per texture, not per texture unit.
Sam Lantinga <slouken@libsdl.org>
parents: 5484
diff changeset
   618
        renderdata->glTexParameteri(data->type, GL_TEXTURE_MIN_FILTER,
be88d105e91c The scale mode is per texture, not per texture unit.
Sam Lantinga <slouken@libsdl.org>
parents: 5484
diff changeset
   619
                                    scaleMode);
be88d105e91c The scale mode is per texture, not per texture unit.
Sam Lantinga <slouken@libsdl.org>
parents: 5484
diff changeset
   620
        renderdata->glTexParameteri(data->type, GL_TEXTURE_MAG_FILTER,
be88d105e91c The scale mode is per texture, not per texture unit.
Sam Lantinga <slouken@libsdl.org>
parents: 5484
diff changeset
   621
                                    scaleMode);
5264
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   622
        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_S,
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   623
                                    GL_CLAMP_TO_EDGE);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   624
        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_T,
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   625
                                    GL_CLAMP_TO_EDGE);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   626
        renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w/2,
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   627
                                 texture_h/2, 0, format, type, NULL);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   628
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   629
        renderdata->glBindTexture(data->type, data->vtexture);
5503
be88d105e91c The scale mode is per texture, not per texture unit.
Sam Lantinga <slouken@libsdl.org>
parents: 5484
diff changeset
   630
        renderdata->glTexParameteri(data->type, GL_TEXTURE_MIN_FILTER,
be88d105e91c The scale mode is per texture, not per texture unit.
Sam Lantinga <slouken@libsdl.org>
parents: 5484
diff changeset
   631
                                    scaleMode);
be88d105e91c The scale mode is per texture, not per texture unit.
Sam Lantinga <slouken@libsdl.org>
parents: 5484
diff changeset
   632
        renderdata->glTexParameteri(data->type, GL_TEXTURE_MAG_FILTER,
be88d105e91c The scale mode is per texture, not per texture unit.
Sam Lantinga <slouken@libsdl.org>
parents: 5484
diff changeset
   633
                                    scaleMode);
5264
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   634
        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_S,
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   635
                                    GL_CLAMP_TO_EDGE);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   636
        renderdata->glTexParameteri(data->type, GL_TEXTURE_WRAP_T,
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   637
                                    GL_CLAMP_TO_EDGE);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   638
        renderdata->glTexImage2D(data->type, 0, internalFormat, texture_w/2,
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   639
                                 texture_h/2, 0, format, type, NULL);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   640
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   641
        renderdata->glDisable(data->type);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   642
    }
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   643
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   644
    GL_CheckError("", renderer);
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   645
    return 0;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   646
}
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   647
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   648
static int
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   649
GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   650
                 const SDL_Rect * rect, const void *pixels, int pitch)
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   651
{
1927
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   652
    GL_RenderData *renderdata = (GL_RenderData *) renderer->driverdata;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   653
    GL_TextureData *data = (GL_TextureData *) texture->driverdata;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   654
5147
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
   655
    GL_ActivateRenderer(renderer);
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
   656
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   657
    GL_CheckError("", renderer);
5397
88ff1f463134 Hopefully fixed crashes when creating multiple streaming textures of different sizes.
Sam Lantinga <slouken@libsdl.org>
parents: 5381
diff changeset
   658
    renderdata->glEnable(data->type);
88ff1f463134 Hopefully fixed crashes when creating multiple streaming textures of different sizes.
Sam Lantinga <slouken@libsdl.org>
parents: 5381
diff changeset
   659
    renderdata->glBindTexture(data->type, data->texture);
5227
9c0c4d767ef6 Reduce duplicated code in the texture update code paths
Sam Lantinga <slouken@libsdl.org>
parents: 5226
diff changeset
   660
    renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
9c0c4d767ef6 Reduce duplicated code in the texture update code paths
Sam Lantinga <slouken@libsdl.org>
parents: 5226
diff changeset
   661
    renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH,
9c0c4d767ef6 Reduce duplicated code in the texture update code paths
Sam Lantinga <slouken@libsdl.org>
parents: 5226
diff changeset
   662
                              (pitch / SDL_BYTESPERPIXEL(texture->format)));
1927
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   663
    renderdata->glTexSubImage2D(data->type, 0, rect->x, rect->y, rect->w,
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   664
                                rect->h, data->format, data->formattype,
aeb8263d377a OpenGL renderer is feature complete!
Sam Lantinga <slouken@libsdl.org>
parents: 1926
diff changeset
   665
                                pixels);
5264
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   666
    if (data->yuv) {
5265
48724afcdc6e Ah there, that fixed it. :)
Sam Lantinga <slouken@libsdl.org>
parents: 5264
diff changeset
   667
        renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, (pitch / 2));
48724afcdc6e Ah there, that fixed it. :)
Sam Lantinga <slouken@libsdl.org>
parents: 5264
diff changeset
   668
5264
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   669
        /* Skip to the correct offset into the next texture */
6135
b052a5882a47 Fixed bug 1315 - Greenish video when video size smaller than texture
Sam Lantinga <slouken@libsdl.org>
parents: 5981
diff changeset
   670
        pixels = (const void*)((const Uint8*)pixels + rect->h * pitch);
5264
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   671
        if (texture->format == SDL_PIXELFORMAT_YV12) {
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   672
            renderdata->glBindTexture(data->type, data->vtexture);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   673
        } else {
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   674
            renderdata->glBindTexture(data->type, data->utexture);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   675
        }
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   676
        renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   677
                                    rect->w/2, rect->h/2,
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   678
                                    data->format, data->formattype, pixels);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   679
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   680
        /* Skip to the correct offset into the next texture */
6135
b052a5882a47 Fixed bug 1315 - Greenish video when video size smaller than texture
Sam Lantinga <slouken@libsdl.org>
parents: 5981
diff changeset
   681
        pixels = (const void*)((const Uint8*)pixels + (rect->h * pitch)/4);
5264
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   682
        if (texture->format == SDL_PIXELFORMAT_YV12) {
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   683
            renderdata->glBindTexture(data->type, data->utexture);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   684
        } else {
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   685
            renderdata->glBindTexture(data->type, data->vtexture);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   686
        }
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   687
        renderdata->glTexSubImage2D(data->type, 0, rect->x/2, rect->y/2,
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   688
                                    rect->w/2, rect->h/2,
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   689
                                    data->format, data->formattype, pixels);
7ace5f8f432f Initial pass at shader YV12 support - doesn't quite work yet.
Sam Lantinga <slouken@libsdl.org>
parents: 5262
diff changeset
   690
    }
3041
20d65430e63c Fixed OpenGL state issue reported by Dmytro Bogovych
Sam Lantinga <slouken@libsdl.org>
parents: 3013
diff changeset
   691
    renderdata->glDisable(data->type);
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   692
    if (GL_CheckError("glTexSubImage2D()", renderer) > 0) {
1924
69217fdd2c0a If the OpenGL renderer is selected for a non-OpenGL window, recreate the window with OpenGL enabled.
Sam Lantinga <slouken@libsdl.org>
parents: 1923
diff changeset
   693
        return -1;
69217fdd2c0a If the OpenGL renderer is selected for a non-OpenGL window, recreate the window with OpenGL enabled.
Sam Lantinga <slouken@libsdl.org>
parents: 1923
diff changeset
   694
    }
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   695
    return 0;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   696
}
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   697
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   698
static int
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   699
GL_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
5156
307ccc9c135e Made it possible to create a texture of any format, even if not supported by the renderer.
Sam Lantinga <slouken@libsdl.org>
parents: 5154
diff changeset
   700
               const SDL_Rect * rect, void **pixels, int *pitch)
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   701
{
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   702
    GL_TextureData *data = (GL_TextureData *) texture->driverdata;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   703
5227
9c0c4d767ef6 Reduce duplicated code in the texture update code paths
Sam Lantinga <slouken@libsdl.org>
parents: 5226
diff changeset
   704
    data->locked_rect = *rect;
9c0c4d767ef6 Reduce duplicated code in the texture update code paths
Sam Lantinga <slouken@libsdl.org>
parents: 5226
diff changeset
   705
    *pixels = 
1920
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   706
        (void *) ((Uint8 *) data->pixels + rect->y * data->pitch +
5156
307ccc9c135e Made it possible to create a texture of any format, even if not supported by the renderer.
Sam Lantinga <slouken@libsdl.org>
parents: 5154
diff changeset
   707
                  rect->x * SDL_BYTESPERPIXEL(texture->format));
1920
8a162bfdc838 Convert SDL_malloc to SDL_calloc if appropriate, slightly faster on operating systems which map the zero page for memory allocations.
Sam Lantinga <slouken@libsdl.org>
parents: 1919
diff changeset
   708
    *pitch = data->pitch;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   709
    return 0;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   710
}
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   711
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   712
static void
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   713
GL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   714
{
5156
307ccc9c135e Made it possible to create a texture of any format, even if not supported by the renderer.
Sam Lantinga <slouken@libsdl.org>
parents: 5154
diff changeset
   715
    GL_TextureData *data = (GL_TextureData *) texture->driverdata;
5227
9c0c4d767ef6 Reduce duplicated code in the texture update code paths
Sam Lantinga <slouken@libsdl.org>
parents: 5226
diff changeset
   716
    const SDL_Rect *rect;
9c0c4d767ef6 Reduce duplicated code in the texture update code paths
Sam Lantinga <slouken@libsdl.org>
parents: 5226
diff changeset
   717
    void *pixels;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   718
5227
9c0c4d767ef6 Reduce duplicated code in the texture update code paths
Sam Lantinga <slouken@libsdl.org>
parents: 5226
diff changeset
   719
    rect = &data->locked_rect;
9c0c4d767ef6 Reduce duplicated code in the texture update code paths
Sam Lantinga <slouken@libsdl.org>
parents: 5226
diff changeset
   720
    pixels = 
9c0c4d767ef6 Reduce duplicated code in the texture update code paths
Sam Lantinga <slouken@libsdl.org>
parents: 5226
diff changeset
   721
        (void *) ((Uint8 *) data->pixels + rect->y * data->pitch +
9c0c4d767ef6 Reduce duplicated code in the texture update code paths
Sam Lantinga <slouken@libsdl.org>
parents: 5226
diff changeset
   722
                  rect->x * SDL_BYTESPERPIXEL(texture->format));
9c0c4d767ef6 Reduce duplicated code in the texture update code paths
Sam Lantinga <slouken@libsdl.org>
parents: 5226
diff changeset
   723
    GL_UpdateTexture(renderer, texture, rect, pixels, data->pitch);
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   724
}
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   725
5297
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   726
static int
6247
b6212690f78d Renamed SetTargetTexture() to SetRenderTarget()
Sam Lantinga <slouken@libsdl.org>
parents: 6246
diff changeset
   727
GL_SetRenderTarget(SDL_Renderer * renderer, SDL_Texture * texture)
6246
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   728
{
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   729
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;    
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   730
    GL_TextureData *texturedata;
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   731
    GLenum status;
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   732
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   733
    GL_ActivateRenderer(renderer);
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   734
    
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   735
    if (texture == NULL) {
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   736
        data->glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   737
        return 0;
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   738
    }
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   739
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   740
    texturedata = (GL_TextureData *) texture->driverdata;
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   741
    data->glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, texturedata->fbo->FBO);
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   742
    /* TODO: check if texture pixel format allows this operation */
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   743
    data->glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, texturedata->type, texturedata->texture, 0);
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   744
    /* Check FBO status */
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   745
    status = data->glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   746
    if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
7037
3fedf1f25b94 Make SDL_SetError and friends unconditionally return -1.
Ryan C. Gordon <icculus@icculus.org>
parents: 6885
diff changeset
   747
        return SDL_SetError("glFramebufferTexture2DEXT() failed");
6246
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   748
    }
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   749
    return 0;
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   750
}
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   751
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   752
static int
5297
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   753
GL_UpdateViewport(SDL_Renderer * renderer)
5224
2178ffe17222 Added function SDL_RenderSetClipRect()
Sam Lantinga <slouken@libsdl.org>
parents: 5204
diff changeset
   754
{
2178ffe17222 Added function SDL_RenderSetClipRect()
Sam Lantinga <slouken@libsdl.org>
parents: 5204
diff changeset
   755
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
2178ffe17222 Added function SDL_RenderSetClipRect()
Sam Lantinga <slouken@libsdl.org>
parents: 5204
diff changeset
   756
5297
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   757
    if (SDL_CurrentContext != data->context) {
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   758
        /* We'll update the viewport after we rebind the context */
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   759
        return 0;
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   760
    }
5224
2178ffe17222 Added function SDL_RenderSetClipRect()
Sam Lantinga <slouken@libsdl.org>
parents: 5204
diff changeset
   761
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   762
    if (!renderer->viewport.w || !renderer->viewport.h) {
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   763
        /* The viewport isn't set up yet, ignore it */
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   764
        return -1;
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   765
    }
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   766
5297
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   767
    data->glViewport(renderer->viewport.x, renderer->viewport.y,
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   768
                     renderer->viewport.w, renderer->viewport.h);
5224
2178ffe17222 Added function SDL_RenderSetClipRect()
Sam Lantinga <slouken@libsdl.org>
parents: 5204
diff changeset
   769
5297
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   770
    data->glMatrixMode(GL_PROJECTION);
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   771
    data->glLoadIdentity();
6246
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   772
    if (renderer->target) {
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   773
        data->glOrtho((GLdouble) 0,
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   774
                      (GLdouble) renderer->viewport.w,
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   775
                      (GLdouble) 0,
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   776
                      (GLdouble) renderer->viewport.h,
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   777
                       0.0, 1.0);
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   778
    } else {
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   779
        data->glOrtho((GLdouble) 0,
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   780
                      (GLdouble) renderer->viewport.w,
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   781
                      (GLdouble) renderer->viewport.h,
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   782
                      (GLdouble) 0,
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   783
                       0.0, 1.0);
c70ec935a4bb Reorganized the render target code, moving the viewport handling to the general code and adding software implementation.
Sam Lantinga <slouken@libsdl.org>
parents: 6237
diff changeset
   784
    }
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   785
    GL_CheckError("", renderer);
5297
1800dc39b74c Changed the concept of a render clip rect to a render viewport.
Sam Lantinga <slouken@libsdl.org>
parents: 5276
diff changeset
   786
    return 0;
5224
2178ffe17222 Added function SDL_RenderSetClipRect()
Sam Lantinga <slouken@libsdl.org>
parents: 5204
diff changeset
   787
}
2178ffe17222 Added function SDL_RenderSetClipRect()
Sam Lantinga <slouken@libsdl.org>
parents: 5204
diff changeset
   788
7141
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   789
static int
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   790
GL_UpdateClipRect(SDL_Renderer * renderer)
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   791
{
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   792
    const SDL_Rect *rect = &renderer->clip_rect;
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   793
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   794
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   795
    if (!SDL_RectEmpty(rect)) {
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   796
        data->glEnable(GL_SCISSOR_TEST);
7169
d27e9ee7310f Fixed bug 1844 - glScissor calls are wrong - Patch attached
Philipp Wiesemann <philipp.wiesemann@arcor.de>
parents: 7161
diff changeset
   797
        int lowerLeft = renderer->viewport.h - rect->y - rect->h;
d27e9ee7310f Fixed bug 1844 - glScissor calls are wrong - Patch attached
Philipp Wiesemann <philipp.wiesemann@arcor.de>
parents: 7161
diff changeset
   798
        data->glScissor(rect->x, lowerLeft, rect->w, rect->h);
7141
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   799
    } else {
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   800
        data->glDisable(GL_SCISSOR_TEST);
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   801
    }
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   802
    return 0;
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   803
}
e276777b4247 First pass on SDL render clip rect functionality
Sam Lantinga <slouken@libsdl.org>
parents: 7091
diff changeset
   804
5224
2178ffe17222 Added function SDL_RenderSetClipRect()
Sam Lantinga <slouken@libsdl.org>
parents: 5204
diff changeset
   805
static void
5355
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   806
GL_SetShader(GL_RenderData * data, GL_Shader shader)
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   807
{
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   808
    if (data->shaders && shader != data->current.shader) {
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   809
        GL_SelectShader(data->shaders, shader);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   810
        data->current.shader = shader;
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   811
    }
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   812
}
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   813
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   814
static void
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   815
GL_SetColor(GL_RenderData * data, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   816
{
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   817
    Uint32 color = ((a << 24) | (r << 16) | (g << 8) | b);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   818
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   819
    if (color != data->current.color) {
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   820
        data->glColor4f((GLfloat) r * inv255f,
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   821
                        (GLfloat) g * inv255f,
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   822
                        (GLfloat) b * inv255f,
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   823
                        (GLfloat) a * inv255f);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   824
        data->current.color = color;
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   825
    }
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   826
}
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   827
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   828
static void
5140
e743b9c3f6d6 Making the API simpler, the blend modes are "none, blend, add" and are supported by all renderers.
Sam Lantinga <slouken@libsdl.org>
parents: 5138
diff changeset
   829
GL_SetBlendMode(GL_RenderData * data, int blendMode)
2936
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   830
{
5355
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   831
    if (blendMode != data->current.blendMode) {
2936
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   832
        switch (blendMode) {
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   833
        case SDL_BLENDMODE_NONE:
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   834
            data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   835
            data->glDisable(GL_BLEND);
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   836
            break;
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   837
        case SDL_BLENDMODE_BLEND:
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   838
            data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   839
            data->glEnable(GL_BLEND);
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   840
            data->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   841
            break;
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   842
        case SDL_BLENDMODE_ADD:
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   843
            data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   844
            data->glEnable(GL_BLEND);
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   845
            data->glBlendFunc(GL_SRC_ALPHA, GL_ONE);
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   846
            break;
5184
d976b67150c5 Restored SDL_BLENDMODE_MOD for MAME
Sam Lantinga <slouken@libsdl.org>
parents: 5166
diff changeset
   847
        case SDL_BLENDMODE_MOD:
d976b67150c5 Restored SDL_BLENDMODE_MOD for MAME
Sam Lantinga <slouken@libsdl.org>
parents: 5166
diff changeset
   848
            data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
d976b67150c5 Restored SDL_BLENDMODE_MOD for MAME
Sam Lantinga <slouken@libsdl.org>
parents: 5166
diff changeset
   849
            data->glEnable(GL_BLEND);
d976b67150c5 Restored SDL_BLENDMODE_MOD for MAME
Sam Lantinga <slouken@libsdl.org>
parents: 5166
diff changeset
   850
            data->glBlendFunc(GL_ZERO, GL_SRC_COLOR);
d976b67150c5 Restored SDL_BLENDMODE_MOD for MAME
Sam Lantinga <slouken@libsdl.org>
parents: 5166
diff changeset
   851
            break;
2936
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   852
        }
5355
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   853
        data->current.blendMode = blendMode;
2936
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   854
    }
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   855
}
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   856
5355
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   857
static void
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   858
GL_SetDrawingState(SDL_Renderer * renderer)
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   859
{
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   860
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   861
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   862
    GL_ActivateRenderer(renderer);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   863
5381
79e60256dbf7 Fixed compiler warnings
Sam Lantinga <slouken@libsdl.org>
parents: 5355
diff changeset
   864
    GL_SetColor(data, renderer->r,
79e60256dbf7 Fixed compiler warnings
Sam Lantinga <slouken@libsdl.org>
parents: 5355
diff changeset
   865
                      renderer->g,
79e60256dbf7 Fixed compiler warnings
Sam Lantinga <slouken@libsdl.org>
parents: 5355
diff changeset
   866
                      renderer->b,
79e60256dbf7 Fixed compiler warnings
Sam Lantinga <slouken@libsdl.org>
parents: 5355
diff changeset
   867
                      renderer->a);
5355
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   868
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   869
    GL_SetBlendMode(data, renderer->blendMode);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   870
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   871
    GL_SetShader(data, SHADER_SOLID);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   872
}
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   873
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   874
static int
3596
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   875
GL_RenderClear(SDL_Renderer * renderer)
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   876
{
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   877
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   878
5147
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
   879
    GL_ActivateRenderer(renderer);
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
   880
3596
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   881
    data->glClearColor((GLfloat) renderer->r * inv255f,
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   882
                       (GLfloat) renderer->g * inv255f,
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   883
                       (GLfloat) renderer->b * inv255f,
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   884
                       (GLfloat) renderer->a * inv255f);
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   885
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   886
    data->glClear(GL_COLOR_BUFFER_BIT);
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   887
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   888
    return 0;
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   889
}
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   890
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   891
static int
6528
e978048ced60 Added SDL_RenderSetScale() and SDL_RenderGetScale()
Sam Lantinga <slouken@libsdl.org>
parents: 6499
diff changeset
   892
GL_RenderDrawPoints(SDL_Renderer * renderer, const SDL_FPoint * points,
3596
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   893
                    int count)
2884
9dde605c7540 Date: Fri, 19 Dec 2008 20:17:35 +0100
Sam Lantinga <slouken@libsdl.org>
parents: 2858
diff changeset
   894
{
9dde605c7540 Date: Fri, 19 Dec 2008 20:17:35 +0100
Sam Lantinga <slouken@libsdl.org>
parents: 2858
diff changeset
   895
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
3536
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   896
    int i;
2884
9dde605c7540 Date: Fri, 19 Dec 2008 20:17:35 +0100
Sam Lantinga <slouken@libsdl.org>
parents: 2858
diff changeset
   897
5355
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   898
    GL_SetDrawingState(renderer);
2884
9dde605c7540 Date: Fri, 19 Dec 2008 20:17:35 +0100
Sam Lantinga <slouken@libsdl.org>
parents: 2858
diff changeset
   899
2901
133601e3b255 Added RenderPiont() API
Sam Lantinga <slouken@libsdl.org>
parents: 2893
diff changeset
   900
    data->glBegin(GL_POINTS);
3536
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   901
    for (i = 0; i < count; ++i) {
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   902
        data->glVertex2f(0.5f + points[i].x, 0.5f + points[i].y);
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   903
    }
2901
133601e3b255 Added RenderPiont() API
Sam Lantinga <slouken@libsdl.org>
parents: 2893
diff changeset
   904
    data->glEnd();
133601e3b255 Added RenderPiont() API
Sam Lantinga <slouken@libsdl.org>
parents: 2893
diff changeset
   905
133601e3b255 Added RenderPiont() API
Sam Lantinga <slouken@libsdl.org>
parents: 2893
diff changeset
   906
    return 0;
133601e3b255 Added RenderPiont() API
Sam Lantinga <slouken@libsdl.org>
parents: 2893
diff changeset
   907
}
133601e3b255 Added RenderPiont() API
Sam Lantinga <slouken@libsdl.org>
parents: 2893
diff changeset
   908
133601e3b255 Added RenderPiont() API
Sam Lantinga <slouken@libsdl.org>
parents: 2893
diff changeset
   909
static int
6528
e978048ced60 Added SDL_RenderSetScale() and SDL_RenderGetScale()
Sam Lantinga <slouken@libsdl.org>
parents: 6499
diff changeset
   910
GL_RenderDrawLines(SDL_Renderer * renderer, const SDL_FPoint * points,
3596
f638ded38b8a Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color.
Sam Lantinga <slouken@libsdl.org>
parents: 3536
diff changeset
   911
                   int count)
2901
133601e3b255 Added RenderPiont() API
Sam Lantinga <slouken@libsdl.org>
parents: 2893
diff changeset
   912
{
133601e3b255 Added RenderPiont() API
Sam Lantinga <slouken@libsdl.org>
parents: 2893
diff changeset
   913
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
3536
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   914
    int i;
2901
133601e3b255 Added RenderPiont() API
Sam Lantinga <slouken@libsdl.org>
parents: 2893
diff changeset
   915
5355
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   916
    GL_SetDrawingState(renderer);
2901
133601e3b255 Added RenderPiont() API
Sam Lantinga <slouken@libsdl.org>
parents: 2893
diff changeset
   917
3536
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   918
    if (count > 2 && 
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   919
        points[0].x == points[count-1].x && points[0].y == points[count-1].y) {
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   920
        data->glBegin(GL_LINE_LOOP);
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   921
        /* GL_LINE_LOOP takes care of the final segment */
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   922
        --count;
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   923
        for (i = 0; i < count; ++i) {
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   924
            data->glVertex2f(0.5f + points[i].x, 0.5f + points[i].y);
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   925
        }
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   926
        data->glEnd();
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   927
    } else {
5086
c2539ff054c8 Fixed compiling on Windows Mobile SDK 5.0 with Visual Studio 2008
Sam Lantinga <slouken@libsdl.org>
parents: 5062
diff changeset
   928
#if defined(__APPLE__) || defined(__WIN32__)
4910
f205711f73d5 Fix and rename VS2010 project files, add tests to VS2010 solution, fix VS compiler warning
Andreas Schiffler <aschiffler@ferzkopp.net>
parents: 4905
diff changeset
   929
#else
4905
9779093454d2 This fixes SDL_renderer_gl so that it builds with c89.
Sam Lantinga <slouken@libsdl.org>
parents: 4455
diff changeset
   930
        int x1, y1, x2, y2;
4910
f205711f73d5 Fix and rename VS2010 project files, add tests to VS2010 solution, fix VS compiler warning
Andreas Schiffler <aschiffler@ferzkopp.net>
parents: 4905
diff changeset
   931
#endif
4905
9779093454d2 This fixes SDL_renderer_gl so that it builds with c89.
Sam Lantinga <slouken@libsdl.org>
parents: 4455
diff changeset
   932
3536
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   933
        data->glBegin(GL_LINE_STRIP);
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   934
        for (i = 0; i < count; ++i) {
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   935
            data->glVertex2f(0.5f + points[i].x, 0.5f + points[i].y);
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   936
        }
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   937
        data->glEnd();
3474
1edb86163d62 Of COURSE that trick wouldn't work on all renderers. Fall back to something for now, hopefully figure out a better way to do this later.
Sam Lantinga <slouken@libsdl.org>
parents: 3473
diff changeset
   938
3536
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   939
        /* The line is half open, so we need one more point to complete it.
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   940
         * http://www.opengl.org/documentation/specs/version1.1/glspec1.1/node47.html
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   941
         * If we have to, we can use vertical line and horizontal line textures
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   942
         * for vertical and horizontal lines, and then create custom textures
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   943
         * for diagonal lines and software render those.  It's terrible, but at
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   944
         * least it would be pixel perfect.
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   945
         */
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   946
        data->glBegin(GL_POINTS);
5086
c2539ff054c8 Fixed compiling on Windows Mobile SDK 5.0 with Visual Studio 2008
Sam Lantinga <slouken@libsdl.org>
parents: 5062
diff changeset
   947
#if defined(__APPLE__) || defined(__WIN32__)
3536
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   948
        /* Mac OS X and Windows seem to always leave the second point open */
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   949
        data->glVertex2f(0.5f + points[count-1].x, 0.5f + points[count-1].y);
3474
1edb86163d62 Of COURSE that trick wouldn't work on all renderers. Fall back to something for now, hopefully figure out a better way to do this later.
Sam Lantinga <slouken@libsdl.org>
parents: 3473
diff changeset
   950
#else
3536
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   951
        /* Linux seems to leave the right-most or bottom-most point open */
4905
9779093454d2 This fixes SDL_renderer_gl so that it builds with c89.
Sam Lantinga <slouken@libsdl.org>
parents: 4455
diff changeset
   952
        x1 = points[0].x;
9779093454d2 This fixes SDL_renderer_gl so that it builds with c89.
Sam Lantinga <slouken@libsdl.org>
parents: 4455
diff changeset
   953
        y1 = points[0].y;
9779093454d2 This fixes SDL_renderer_gl so that it builds with c89.
Sam Lantinga <slouken@libsdl.org>
parents: 4455
diff changeset
   954
        x2 = points[count-1].x;
9779093454d2 This fixes SDL_renderer_gl so that it builds with c89.
Sam Lantinga <slouken@libsdl.org>
parents: 4455
diff changeset
   955
        y2 = points[count-1].y;
3536
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   956
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   957
        if (x1 > x2) {
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   958
            data->glVertex2f(0.5f + x1, 0.5f + y1);
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   959
        } else if (x2 > x1) {
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   960
            data->glVertex2f(0.5f + x2, 0.5f + y2);
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   961
        } else if (y1 > y2) {
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   962
            data->glVertex2f(0.5f + x1, 0.5f + y1);
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   963
        } else if (y2 > y1) {
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   964
            data->glVertex2f(0.5f + x2, 0.5f + y2);
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   965
        }
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   966
#endif
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   967
        data->glEnd();
3474
1edb86163d62 Of COURSE that trick wouldn't work on all renderers. Fall back to something for now, hopefully figure out a better way to do this later.
Sam Lantinga <slouken@libsdl.org>
parents: 3473
diff changeset
   968
    }
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   969
    GL_CheckError("", renderer);
3455
5a7b5760c875 Include the endpoint in the line we're drawing
Sam Lantinga <slouken@libsdl.org>
parents: 3454
diff changeset
   970
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   971
    return 0;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   972
}
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   973
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   974
static int
6528
e978048ced60 Added SDL_RenderSetScale() and SDL_RenderGetScale()
Sam Lantinga <slouken@libsdl.org>
parents: 6499
diff changeset
   975
GL_RenderFillRects(SDL_Renderer * renderer, const SDL_FRect * rects, int count)
2925
7e21f7662208 Swapped functions to match the other renderer files
Sam Lantinga <slouken@libsdl.org>
parents: 2922
diff changeset
   976
{
7e21f7662208 Swapped functions to match the other renderer files
Sam Lantinga <slouken@libsdl.org>
parents: 2922
diff changeset
   977
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
3536
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   978
    int i;
2925
7e21f7662208 Swapped functions to match the other renderer files
Sam Lantinga <slouken@libsdl.org>
parents: 2922
diff changeset
   979
5355
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
   980
    GL_SetDrawingState(renderer);
2936
066384910f50 iPhone build compiles again (drawing routines need to be implemented)
Sam Lantinga <slouken@libsdl.org>
parents: 2927
diff changeset
   981
3536
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   982
    for (i = 0; i < count; ++i) {
6528
e978048ced60 Added SDL_RenderSetScale() and SDL_RenderGetScale()
Sam Lantinga <slouken@libsdl.org>
parents: 6499
diff changeset
   983
        const SDL_FRect *rect = &rects[i];
3536
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   984
6528
e978048ced60 Added SDL_RenderSetScale() and SDL_RenderGetScale()
Sam Lantinga <slouken@libsdl.org>
parents: 6499
diff changeset
   985
        data->glRectf(rect->x, rect->y, rect->x + rect->w, rect->y + rect->h);
3536
0267b8b1595c Added interfaces for batch drawing of points, lines and rects:
Sam Lantinga <slouken@libsdl.org>
parents: 3533
diff changeset
   986
    }
6494
309599be5c2a Fixed bug 1584 - Improved glError checks in the opengl renderer
Sam Lantinga <slouken@libsdl.org>
parents: 6449
diff changeset
   987
    GL_CheckError("", renderer);
2925
7e21f7662208 Swapped functions to match the other renderer files
Sam Lantinga <slouken@libsdl.org>
parents: 2922
diff changeset
   988
7e21f7662208 Swapped functions to match the other renderer files
Sam Lantinga <slouken@libsdl.org>
parents: 2922
diff changeset
   989
    return 0;
7e21f7662208 Swapped functions to match the other renderer files
Sam Lantinga <slouken@libsdl.org>
parents: 2922
diff changeset
   990
}
7e21f7662208 Swapped functions to match the other renderer files
Sam Lantinga <slouken@libsdl.org>
parents: 2922
diff changeset
   991
7e21f7662208 Swapped functions to match the other renderer files
Sam Lantinga <slouken@libsdl.org>
parents: 2922
diff changeset
   992
static int
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   993
GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
6528
e978048ced60 Added SDL_RenderSetScale() and SDL_RenderGetScale()
Sam Lantinga <slouken@libsdl.org>
parents: 6499
diff changeset
   994
              const SDL_Rect * srcrect, const SDL_FRect * dstrect)
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   995
{
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   996
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   997
    GL_TextureData *texturedata = (GL_TextureData *) texture->driverdata;
6528
e978048ced60 Added SDL_RenderSetScale() and SDL_RenderGetScale()
Sam Lantinga <slouken@libsdl.org>
parents: 6499
diff changeset
   998
    GLfloat minx, miny, maxx, maxy;
1918
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   999
    GLfloat minu, maxu, minv, maxv;
092bd3a019c5 Starting on the OpenGL renderer...
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
  1000
5147
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
  1001
    GL_ActivateRenderer(renderer);
ad50b3db78bd The rendering functions take a context so it's clear what window they're drawing to. This also potentially opens to the door to multi-threaded rendering in the future.
Sam Lantinga <slouken@libsdl.org>
parents: 5142
diff changeset
  1002
5355
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1003
    data->glEnable(texturedata->type);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1004
    if (texturedata->yuv) {
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1005
        data->glActiveTextureARB(GL_TEXTURE2_ARB);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1006
        data->glBindTexture(texturedata->type, texturedata->vtexture);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1007
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1008
        data->glActiveTextureARB(GL_TEXTURE1_ARB);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1009
        data->glBindTexture(texturedata->type, texturedata->utexture);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1010
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1011
        data->glActiveTextureARB(GL_TEXTURE0_ARB);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1012
    }
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1013
    data->glBindTexture(texturedata->type, texturedata->texture);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1014
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1015
    if (texture->modMode) {
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1016
        GL_SetColor(data, texture->r, texture->g, texture->b, texture->a);
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <slouken@libsdl.org>
parents: 5351
diff changeset
  1017
    } else {
cc2215cda170 Added OpenGL state caching for decent speed improvement.
Sam Lantinga <