Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
libSDL
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PocketInsanity
libSDL
Commits
ee61cc31
Commit
ee61cc31
authored
Feb 20, 2011
by
Sam Lantinga
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added OpenGL state caching for decent speed improvement.
parent
8c64c506
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
336 additions
and
234 deletions
+336
-234
SDL_render_gl.c
src/render/opengl/SDL_render_gl.c
+121
-70
SDL_shaders_gl.c
src/render/opengl/SDL_shaders_gl.c
+0
-12
SDL_render_gles.c
src/render/opengles/SDL_render_gles.c
+111
-63
SDL_render_gles2.c
src/render/opengles2/SDL_render_gles2.c
+104
-89
No files found.
src/render/opengl/SDL_render_gl.c
View file @
ee61cc31
...
@@ -87,7 +87,12 @@ typedef struct
...
@@ -87,7 +87,12 @@ typedef struct
{
{
SDL_GLContext
context
;
SDL_GLContext
context
;
SDL_bool
GL_ARB_texture_rectangle_supported
;
SDL_bool
GL_ARB_texture_rectangle_supported
;
int
blendMode
;
struct
{
GL_Shader
shader
;
Uint32
color
;
int
blendMode
;
GLenum
scaleMode
;
}
current
;
/* OpenGL functions */
/* OpenGL functions */
#define SDL_PROC(ret,func,params) ret (APIENTRY *func) params;
#define SDL_PROC(ret,func,params) ret (APIENTRY *func) params;
...
@@ -117,6 +122,7 @@ typedef struct
...
@@ -117,6 +122,7 @@ typedef struct
GLenum
formattype
;
GLenum
formattype
;
void
*
pixels
;
void
*
pixels
;
int
pitch
;
int
pitch
;
int
scaleMode
;
SDL_Rect
locked_rect
;
SDL_Rect
locked_rect
;
/* YV12 texture support */
/* YV12 texture support */
...
@@ -202,6 +208,32 @@ GL_ActivateRenderer(SDL_Renderer * renderer)
...
@@ -202,6 +208,32 @@ GL_ActivateRenderer(SDL_Renderer * renderer)
return
0
;
return
0
;
}
}
/* This is called if we need to invalidate all of the SDL OpenGL state */
static
void
GL_ResetState
(
SDL_Renderer
*
renderer
)
{
GL_RenderData
*
data
=
(
GL_RenderData
*
)
renderer
->
driverdata
;
if
(
SDL_CurrentContext
==
data
->
context
)
{
GL_UpdateViewport
(
renderer
);
}
else
{
GL_ActivateRenderer
(
renderer
);
}
data
->
current
.
shader
=
SHADER_NONE
;
data
->
current
.
color
=
0
;
data
->
current
.
blendMode
=
-
1
;
data
->
current
.
scaleMode
=
0
;
data
->
glDisable
(
GL_DEPTH_TEST
);
data
->
glDisable
(
GL_CULL_FACE
);
/* This ended up causing video discrepancies between OpenGL and Direct3D */
/*data->glEnable(GL_LINE_SMOOTH);*/
data
->
glMatrixMode
(
GL_MODELVIEW
);
data
->
glLoadIdentity
();
}
SDL_Renderer
*
SDL_Renderer
*
GL_CreateRenderer
(
SDL_Window
*
window
,
Uint32
flags
)
GL_CreateRenderer
(
SDL_Window
*
window
,
Uint32
flags
)
{
{
...
@@ -320,13 +352,7 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
...
@@ -320,13 +352,7 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
}
}
/* Set up parameters for rendering */
/* Set up parameters for rendering */
data
->
blendMode
=
-
1
;
GL_ResetState
(
renderer
);
data
->
glDisable
(
GL_DEPTH_TEST
);
data
->
glDisable
(
GL_CULL_FACE
);
/* This ended up causing video discrepancies between OpenGL and Direct3D */
/*data->glEnable(GL_LINE_SMOOTH);*/
data
->
glMatrixMode
(
GL_MODELVIEW
);
data
->
glLoadIdentity
();
return
renderer
;
return
renderer
;
}
}
...
@@ -437,12 +463,9 @@ GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
...
@@ -437,12 +463,9 @@ GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
data
->
format
=
format
;
data
->
format
=
format
;
data
->
formattype
=
type
;
data
->
formattype
=
type
;
data
->
scaleMode
=
GL_LINEAR
;
renderdata
->
glEnable
(
data
->
type
);
renderdata
->
glEnable
(
data
->
type
);
renderdata
->
glBindTexture
(
data
->
type
,
data
->
texture
);
renderdata
->
glBindTexture
(
data
->
type
,
data
->
texture
);
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_MIN_FILTER
,
GL_LINEAR
);
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_MAG_FILTER
,
GL_LINEAR
);
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_S
,
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_S
,
GL_CLAMP_TO_EDGE
);
GL_CLAMP_TO_EDGE
);
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_T
,
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_T
,
...
@@ -492,10 +515,6 @@ GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
...
@@ -492,10 +515,6 @@ GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
renderdata
->
glEnable
(
data
->
type
);
renderdata
->
glEnable
(
data
->
type
);
renderdata
->
glBindTexture
(
data
->
type
,
data
->
utexture
);
renderdata
->
glBindTexture
(
data
->
type
,
data
->
utexture
);
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_MIN_FILTER
,
GL_LINEAR
);
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_MAG_FILTER
,
GL_LINEAR
);
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_S
,
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_S
,
GL_CLAMP_TO_EDGE
);
GL_CLAMP_TO_EDGE
);
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_T
,
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_T
,
...
@@ -504,10 +523,6 @@ GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
...
@@ -504,10 +523,6 @@ GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
texture_h
/
2
,
0
,
format
,
type
,
NULL
);
texture_h
/
2
,
0
,
format
,
type
,
NULL
);
renderdata
->
glBindTexture
(
data
->
type
,
data
->
vtexture
);
renderdata
->
glBindTexture
(
data
->
type
,
data
->
vtexture
);
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_MIN_FILTER
,
GL_LINEAR
);
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_MAG_FILTER
,
GL_LINEAR
);
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_S
,
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_S
,
GL_CLAMP_TO_EDGE
);
GL_CLAMP_TO_EDGE
);
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_T
,
renderdata
->
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_T
,
...
@@ -631,10 +646,33 @@ GL_UpdateViewport(SDL_Renderer * renderer)
...
@@ -631,10 +646,33 @@ GL_UpdateViewport(SDL_Renderer * renderer)
return
0
;
return
0
;
}
}
static
void
GL_SetShader
(
GL_RenderData
*
data
,
GL_Shader
shader
)
{
if
(
data
->
shaders
&&
shader
!=
data
->
current
.
shader
)
{
GL_SelectShader
(
data
->
shaders
,
shader
);
data
->
current
.
shader
=
shader
;
}
}
static
void
GL_SetColor
(
GL_RenderData
*
data
,
Uint8
r
,
Uint8
g
,
Uint8
b
,
Uint8
a
)
{
Uint32
color
=
((
a
<<
24
)
|
(
r
<<
16
)
|
(
g
<<
8
)
|
b
);
if
(
color
!=
data
->
current
.
color
)
{
data
->
glColor4f
((
GLfloat
)
r
*
inv255f
,
(
GLfloat
)
g
*
inv255f
,
(
GLfloat
)
b
*
inv255f
,
(
GLfloat
)
a
*
inv255f
);
data
->
current
.
color
=
color
;
}
}
static
void
static
void
GL_SetBlendMode
(
GL_RenderData
*
data
,
int
blendMode
)
GL_SetBlendMode
(
GL_RenderData
*
data
,
int
blendMode
)
{
{
if
(
blendMode
!=
data
->
blendMode
)
{
if
(
blendMode
!=
data
->
current
.
blendMode
)
{
switch
(
blendMode
)
{
switch
(
blendMode
)
{
case
SDL_BLENDMODE_NONE
:
case
SDL_BLENDMODE_NONE
:
data
->
glTexEnvf
(
GL_TEXTURE_ENV
,
GL_TEXTURE_ENV_MODE
,
GL_REPLACE
);
data
->
glTexEnvf
(
GL_TEXTURE_ENV
,
GL_TEXTURE_ENV_MODE
,
GL_REPLACE
);
...
@@ -656,10 +694,27 @@ GL_SetBlendMode(GL_RenderData * data, int blendMode)
...
@@ -656,10 +694,27 @@ GL_SetBlendMode(GL_RenderData * data, int blendMode)
data
->
glBlendFunc
(
GL_ZERO
,
GL_SRC_COLOR
);
data
->
glBlendFunc
(
GL_ZERO
,
GL_SRC_COLOR
);
break
;
break
;
}
}
data
->
blendMode
=
blendMode
;
data
->
current
.
blendMode
=
blendMode
;
}
}
}
}
static
void
GL_SetDrawingState
(
SDL_Renderer
*
renderer
)
{
GL_RenderData
*
data
=
(
GL_RenderData
*
)
renderer
->
driverdata
;
GL_ActivateRenderer
(
renderer
);
GL_SetColor
(
data
,
(
GLfloat
)
renderer
->
r
,
(
GLfloat
)
renderer
->
g
,
(
GLfloat
)
renderer
->
b
,
(
GLfloat
)
renderer
->
a
);
GL_SetBlendMode
(
data
,
renderer
->
blendMode
);
GL_SetShader
(
data
,
SHADER_SOLID
);
}
static
int
static
int
GL_RenderClear
(
SDL_Renderer
*
renderer
)
GL_RenderClear
(
SDL_Renderer
*
renderer
)
{
{
...
@@ -684,15 +739,7 @@ GL_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points,
...
@@ -684,15 +739,7 @@ GL_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points,
GL_RenderData
*
data
=
(
GL_RenderData
*
)
renderer
->
driverdata
;
GL_RenderData
*
data
=
(
GL_RenderData
*
)
renderer
->
driverdata
;
int
i
;
int
i
;
GL_ActivateRenderer
(
renderer
);
GL_SetDrawingState
(
renderer
);
GL_SetBlendMode
(
data
,
renderer
->
blendMode
);
GL_SelectShader
(
data
->
shaders
,
SHADER_SOLID
);
data
->
glColor4f
((
GLfloat
)
renderer
->
r
*
inv255f
,
(
GLfloat
)
renderer
->
g
*
inv255f
,
(
GLfloat
)
renderer
->
b
*
inv255f
,
(
GLfloat
)
renderer
->
a
*
inv255f
);
data
->
glBegin
(
GL_POINTS
);
data
->
glBegin
(
GL_POINTS
);
for
(
i
=
0
;
i
<
count
;
++
i
)
{
for
(
i
=
0
;
i
<
count
;
++
i
)
{
...
@@ -710,15 +757,7 @@ GL_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points,
...
@@ -710,15 +757,7 @@ GL_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points,
GL_RenderData
*
data
=
(
GL_RenderData
*
)
renderer
->
driverdata
;
GL_RenderData
*
data
=
(
GL_RenderData
*
)
renderer
->
driverdata
;
int
i
;
int
i
;
GL_ActivateRenderer
(
renderer
);
GL_SetDrawingState
(
renderer
);
GL_SetBlendMode
(
data
,
renderer
->
blendMode
);
GL_SelectShader
(
data
->
shaders
,
SHADER_SOLID
);
data
->
glColor4f
((
GLfloat
)
renderer
->
r
*
inv255f
,
(
GLfloat
)
renderer
->
g
*
inv255f
,
(
GLfloat
)
renderer
->
b
*
inv255f
,
(
GLfloat
)
renderer
->
a
*
inv255f
);
if
(
count
>
2
&&
if
(
count
>
2
&&
points
[
0
].
x
==
points
[
count
-
1
].
x
&&
points
[
0
].
y
==
points
[
count
-
1
].
y
)
{
points
[
0
].
x
==
points
[
count
-
1
].
x
&&
points
[
0
].
y
==
points
[
count
-
1
].
y
)
{
...
@@ -781,15 +820,7 @@ GL_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect * rects, int count)
...
@@ -781,15 +820,7 @@ GL_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect * rects, int count)
GL_RenderData
*
data
=
(
GL_RenderData
*
)
renderer
->
driverdata
;
GL_RenderData
*
data
=
(
GL_RenderData
*
)
renderer
->
driverdata
;
int
i
;
int
i
;
GL_ActivateRenderer
(
renderer
);
GL_SetDrawingState
(
renderer
);
GL_SetBlendMode
(
data
,
renderer
->
blendMode
);
GL_SelectShader
(
data
->
shaders
,
SHADER_SOLID
);
data
->
glColor4f
((
GLfloat
)
renderer
->
r
*
inv255f
,
(
GLfloat
)
renderer
->
g
*
inv255f
,
(
GLfloat
)
renderer
->
b
*
inv255f
,
(
GLfloat
)
renderer
->
a
*
inv255f
);
for
(
i
=
0
;
i
<
count
;
++
i
)
{
for
(
i
=
0
;
i
<
count
;
++
i
)
{
const
SDL_Rect
*
rect
=
&
rects
[
i
];
const
SDL_Rect
*
rect
=
&
rects
[
i
];
...
@@ -811,46 +842,66 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
...
@@ -811,46 +842,66 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
GL_ActivateRenderer
(
renderer
);
GL_ActivateRenderer
(
renderer
);
minx
=
dstrect
->
x
;
miny
=
dstrect
->
y
;
maxx
=
dstrect
->
x
+
dstrect
->
w
;
maxy
=
dstrect
->
y
+
dstrect
->
h
;
minu
=
(
GLfloat
)
srcrect
->
x
/
texture
->
w
;
minu
*=
texturedata
->
texw
;
maxu
=
(
GLfloat
)
(
srcrect
->
x
+
srcrect
->
w
)
/
texture
->
w
;
maxu
*=
texturedata
->
texw
;
minv
=
(
GLfloat
)
srcrect
->
y
/
texture
->
h
;
minv
*=
texturedata
->
texh
;
maxv
=
(
GLfloat
)
(
srcrect
->
y
+
srcrect
->
h
)
/
texture
->
h
;
maxv
*=
texturedata
->
texh
;
data
->
glEnable
(
texturedata
->
type
);
data
->
glEnable
(
texturedata
->
type
);
if
(
texturedata
->
yuv
)
{
if
(
texturedata
->
yuv
)
{
data
->
glActiveTextureARB
(
GL_TEXTURE2_ARB
);
data
->
glActiveTextureARB
(
GL_TEXTURE2_ARB
);
data
->
glBindTexture
(
texturedata
->
type
,
texturedata
->
vtexture
);
data
->
glBindTexture
(
texturedata
->
type
,
texturedata
->
vtexture
);
if
(
texturedata
->
scaleMode
!=
data
->
current
.
scaleMode
)
{
data
->
glTexParameteri
(
texturedata
->
type
,
GL_TEXTURE_MIN_FILTER
,
texturedata
->
scaleMode
);
data
->
glTexParameteri
(
texturedata
->
type
,
GL_TEXTURE_MAG_FILTER
,
texturedata
->
scaleMode
);
}
data
->
glActiveTextureARB
(
GL_TEXTURE1_ARB
);
data
->
glActiveTextureARB
(
GL_TEXTURE1_ARB
);
data
->
glBindTexture
(
texturedata
->
type
,
texturedata
->
utexture
);
data
->
glBindTexture
(
texturedata
->
type
,
texturedata
->
utexture
);
if
(
texturedata
->
scaleMode
!=
data
->
current
.
scaleMode
)
{
data
->
glTexParameteri
(
texturedata
->
type
,
GL_TEXTURE_MIN_FILTER
,
texturedata
->
scaleMode
);
data
->
glTexParameteri
(
texturedata
->
type
,
GL_TEXTURE_MAG_FILTER
,
texturedata
->
scaleMode
);
}
data
->
glActiveTextureARB
(
GL_TEXTURE0_ARB
);
data
->
glActiveTextureARB
(
GL_TEXTURE0_ARB
);
}
}
data
->
glBindTexture
(
texturedata
->
type
,
texturedata
->
texture
);
data
->
glBindTexture
(
texturedata
->
type
,
texturedata
->
texture
);
if
(
texturedata
->
scaleMode
!=
data
->
current
.
scaleMode
)
{
data
->
glTexParameteri
(
texturedata
->
type
,
GL_TEXTURE_MIN_FILTER
,
texturedata
->
scaleMode
);
data
->
glTexParameteri
(
texturedata
->
type
,
GL_TEXTURE_MAG_FILTER
,
texturedata
->
scaleMode
);
data
->
current
.
scaleMode
=
texturedata
->
scaleMode
;
}
if
(
texture
->
modMode
)
{
if
(
texture
->
modMode
)
{
data
->
glColor4f
((
GLfloat
)
texture
->
r
*
inv255f
,
GL_SetColor
(
data
,
texture
->
r
,
texture
->
g
,
texture
->
b
,
texture
->
a
);
(
GLfloat
)
texture
->
g
*
inv255f
,
(
GLfloat
)
texture
->
b
*
inv255f
,
(
GLfloat
)
texture
->
a
*
inv255f
);
}
else
{
}
else
{
data
->
glColor4f
(
1
.
0
f
,
1
.
0
f
,
1
.
0
f
,
1
.
0
f
);
GL_SetColor
(
data
,
255
,
255
,
255
,
255
);
}
}
GL_SetBlendMode
(
data
,
texture
->
blendMode
);
GL_SetBlendMode
(
data
,
texture
->
blendMode
);
if
(
texturedata
->
yuv
)
{
if
(
texturedata
->
yuv
)
{
GL_Se
lectShader
(
data
->
shaders
,
SHADER_YV12
);
GL_Se
tShader
(
data
,
SHADER_YV12
);
}
else
{
}
else
{
GL_Se
lectShader
(
data
->
shaders
,
SHADER_RGB
);
GL_Se
tShader
(
data
,
SHADER_RGB
);
}
}
minx
=
dstrect
->
x
;
miny
=
dstrect
->
y
;
maxx
=
dstrect
->
x
+
dstrect
->
w
;
maxy
=
dstrect
->
y
+
dstrect
->
h
;
minu
=
(
GLfloat
)
srcrect
->
x
/
texture
->
w
;
minu
*=
texturedata
->
texw
;
maxu
=
(
GLfloat
)
(
srcrect
->
x
+
srcrect
->
w
)
/
texture
->
w
;
maxu
*=
texturedata
->
texw
;
minv
=
(
GLfloat
)
srcrect
->
y
/
texture
->
h
;
minv
*=
texturedata
->
texh
;
maxv
=
(
GLfloat
)
(
srcrect
->
y
+
srcrect
->
h
)
/
texture
->
h
;
maxv
*=
texturedata
->
texh
;
data
->
glBegin
(
GL_TRIANGLE_STRIP
);
data
->
glBegin
(
GL_TRIANGLE_STRIP
);
data
->
glTexCoord2f
(
minu
,
minv
);
data
->
glTexCoord2f
(
minu
,
minv
);
data
->
glVertex2f
((
GLfloat
)
minx
,
(
GLfloat
)
miny
);
data
->
glVertex2f
((
GLfloat
)
minx
,
(
GLfloat
)
miny
);
...
...
src/render/opengl/SDL_shaders_gl.c
View file @
ee61cc31
...
@@ -60,7 +60,6 @@ struct GL_ShaderContext
...
@@ -60,7 +60,6 @@ struct GL_ShaderContext
SDL_bool
GL_ARB_texture_rectangle_supported
;
SDL_bool
GL_ARB_texture_rectangle_supported
;
GL_Shader
current_shader
;
GL_ShaderData
shaders
[
NUM_SHADERS
];
GL_ShaderData
shaders
[
NUM_SHADERS
];
};
};
...
@@ -341,18 +340,7 @@ GL_CreateShaderContext()
...
@@ -341,18 +340,7 @@ GL_CreateShaderContext()
void
void
GL_SelectShader
(
GL_ShaderContext
*
ctx
,
GL_Shader
shader
)
GL_SelectShader
(
GL_ShaderContext
*
ctx
,
GL_Shader
shader
)
{
{
/* Nothing to do if there's no shader support */
if
(
!
ctx
)
{
return
;
}
/* Nothing to do if there's no shader change */
if
(
shader
==
ctx
->
current_shader
)
{
return
;
}
ctx
->
glUseProgramObjectARB
(
ctx
->
shaders
[
shader
].
program
);
ctx
->
glUseProgramObjectARB
(
ctx
->
shaders
[
shader
].
program
);
ctx
->
current_shader
=
shader
;
}
}
void
void
...
...
src/render/opengles/SDL_render_gles.c
View file @
ee61cc31
...
@@ -84,7 +84,12 @@ SDL_RenderDriver GLES_RenderDriver = {
...
@@ -84,7 +84,12 @@ SDL_RenderDriver GLES_RenderDriver = {
typedef
struct
typedef
struct
{
{
SDL_GLContext
context
;
SDL_GLContext
context
;
int
blendMode
;
struct
{
Uint32
color
;
int
blendMode
;
GLenum
scaleMode
;
SDL_bool
tex_coords
;
}
current
;
SDL_bool
useDrawTexture
;
SDL_bool
useDrawTexture
;
SDL_bool
GL_OES_draw_texture_supported
;
SDL_bool
GL_OES_draw_texture_supported
;
...
@@ -100,6 +105,7 @@ typedef struct
...
@@ -100,6 +105,7 @@ typedef struct
GLenum
formattype
;
GLenum
formattype
;
void
*
pixels
;
void
*
pixels
;
int
pitch
;
int
pitch
;
GLenum
scaleMode
;
}
GLES_TextureData
;
}
GLES_TextureData
;
static
void
static
void
...
@@ -154,6 +160,33 @@ GLES_ActivateRenderer(SDL_Renderer * renderer)
...
@@ -154,6 +160,33 @@ GLES_ActivateRenderer(SDL_Renderer * renderer)
return
0
;
return
0
;
}
}
/* This is called if we need to invalidate all of the SDL OpenGL state */
static
void
GLES_ResetState
(
SDL_Renderer
*
renderer
)
{
GLES_RenderData
*
data
=
(
GLES_RenderData
*
)
renderer
->
driverdata
;
if
(
SDL_CurrentContext
==
data
->
context
)
{
GLES_UpdateViewport
(
renderer
);
}
else
{
GLES_ActivateRenderer
(
renderer
);
}
data
->
current
.
color
=
0
;
data
->
current
.
blendMode
=
-
1
;
data
->
current
.
scaleMode
=
0
;
data
->
current
.
tex_coords
=
SDL_FALSE
;
glDisable
(
GL_DEPTH_TEST
);
glDisable
(
GL_CULL_FACE
);
glMatrixMode
(
GL_MODELVIEW
);
glLoadIdentity
();
glEnableClientState
(
GL_VERTEX_ARRAY
);
glDisableClientState
(
GL_TEXTURE_COORD_ARRAY
);
}
SDL_Renderer
*
SDL_Renderer
*
GLES_CreateRenderer
(
SDL_Window
*
window
,
Uint32
flags
)
GLES_CreateRenderer
(
SDL_Window
*
window
,
Uint32
flags
)
{
{
...
@@ -234,15 +267,8 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
...
@@ -234,15 +267,8 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer
->
info
.
max_texture_height
=
value
;
renderer
->
info
.
max_texture_height
=
value
;
/* Set up parameters for rendering */
/* Set up parameters for rendering */
data
->
blendMode
=
-
1
;
GLES_ResetState
(
renderer
);
glDisable
(
GL_DEPTH_TEST
);
glDisable
(
GL_CULL_FACE
);
glMatrixMode
(
GL_MODELVIEW
);
glLoadIdentity
();
glEnableClientState
(
GL_VERTEX_ARRAY
);
//glEnableClientState(GL_TEXTURE_COORD_ARRAY);
return
renderer
;
return
renderer
;
}
}
...
@@ -319,15 +345,10 @@ GLES_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
...
@@ -319,15 +345,10 @@ GLES_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
data
->
format
=
format
;
data
->
format
=
format
;
data
->
formattype
=
type
;
data
->
formattype
=
type
;
data
->
scaleMode
=
GL_LINEAR
;
glBindTexture
(
data
->
type
,
data
->
texture
);
glBindTexture
(
data
->
type
,
data
->
texture
);
glTexParameteri
(
data
->
type
,
GL_TEXTURE_MIN_FILTER
,
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_S
,
GL_CLAMP_TO_EDGE
);
GL_LINEAR
);
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_T
,
GL_CLAMP_TO_EDGE
);
glTexParameteri
(
data
->
type
,
GL_TEXTURE_MAG_FILTER
,
GL_LINEAR
);
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_S
,
GL_CLAMP_TO_EDGE
);
glTexParameteri
(
data
->
type
,
GL_TEXTURE_WRAP_T
,
GL_CLAMP_TO_EDGE
);
glTexImage2D
(
data
->
type
,
0
,
internalFormat
,
texture_w
,
glTexImage2D
(
data
->
type
,
0
,
internalFormat
,
texture_w
,
texture_h
,
0
,
format
,
type
,
NULL
);
texture_h
,
0
,
format
,
type
,
NULL
);
...
@@ -453,25 +474,24 @@ GLES_UpdateViewport(SDL_Renderer * renderer)
...
@@ -453,25 +474,24 @@ GLES_UpdateViewport(SDL_Renderer * renderer)
return
0
;
return
0
;
}
}
static
int
static
void
GLES_
RenderClear
(
SDL_Renderer
*
renderer
)
GLES_
SetColor
(
GLES_RenderData
*
data
,
Uint8
r
,
Uint8
g
,
Uint8
b
,
Uint8
a
)
{
{
GLES_ActivateRenderer
(
renderer
);
Uint32
color
=
((
a
<<
24
)
|
(
r
<<
16
)
|
(
g
<<
8
)
|
b
);
glClearColor
((
GLfloat
)
renderer
->
r
*
inv255f
,
if
(
color
!=
data
->
current
.
color
)
{
(
GLfloat
)
renderer
->
g
*
inv255f
,
glColor4f
((
GLfloat
)
r
*
inv255f
,
(
GLfloat
)
renderer
->
b
*
inv255f
,
(
GLfloat
)
g
*
inv255f
,
(
GLfloat
)
renderer
->
a
*
inv255f
);
(
GLfloat
)
b
*
inv255f
,
(
GLfloat
)
a
*
inv255f
);
glClear
(
GL_COLOR_BUFFER_BIT
);
data
->
current
.
color
=
color
;
}
return
0
;
}
}
static
void
static
void
GLES_SetBlendMode
(
GLES_RenderData
*
data
,
int
blendMode
)
GLES_SetBlendMode
(
GLES_RenderData
*
data
,
int
blendMode
)
{
{
if
(
blendMode
!=
data
->
blendMode
)
{
if
(
blendMode
!=
data
->
current
.
blendMode
)
{
switch
(
blendMode
)
{
switch
(
blendMode
)
{
case
SDL_BLENDMODE_NONE
:
case
SDL_BLENDMODE_NONE
:
glTexEnvf
(
GL_TEXTURE_ENV
,
GL_TEXTURE_ENV_MODE
,
GL_REPLACE
);
glTexEnvf
(
GL_TEXTURE_ENV
,
GL_TEXTURE_ENV_MODE
,
GL_REPLACE
);
...
@@ -493,10 +513,55 @@ GLES_SetBlendMode(GLES_RenderData * data, int blendMode)
...
@@ -493,10 +513,55 @@ GLES_SetBlendMode(GLES_RenderData * data, int blendMode)
glBlendFunc
(
GL_ZERO
,
GL_SRC_COLOR
);
glBlendFunc
(
GL_ZERO
,
GL_SRC_COLOR
);
break
;
break
;
}
}
data
->
blendMode
=
blendMode
;
data
->
current
.
blendMode
=
blendMode
;
}
}
static
void
GLES_SetTexCoords
(
GLES_RenderData
*
data
,
SDL_bool
enabled
)
{
if
(
enabled
!=
data
->
current
.
tex_coords
)
{
if
(
enabled
)
{
glEnableClientState
(
GL_TEXTURE_COORD_ARRAY
);
}
else
{
glDisableClientState
(
GL_TEXTURE_COORD_ARRAY
);
}
data
->
current
.
tex_coords
=
enabled
;
}
}
}
}
static
void
GLES_SetDrawingState
(
SDL_Renderer
*
renderer
)
{
GLES_RenderData
*
data
=
(
GLES_RenderData
*
)
renderer
->
driverdata
;
GLES_ActivateRenderer
(
renderer
);
GLES_SetColor
(
data
,
(
GLfloat
)
renderer
->
r
,
(
GLfloat
)
renderer
->
g
,
(
GLfloat
)
renderer
->
b
,
(
GLfloat
)
renderer
->
a
);
GLES_SetBlendMode
(
data
,
renderer
->
blendMode
);
GLES_SetTexCoords
(
data
,
SDL_FALSE
);
}
static
int
GLES_RenderClear
(
SDL_Renderer
*
renderer
)
{
GLES_ActivateRenderer
(
renderer
);
glClearColor
((
GLfloat
)
renderer
->
r
*
inv255f
,
(
GLfloat
)
renderer
->
g
*
inv255f
,
(
GLfloat
)
renderer
->
b
*
inv255f
,
(
GLfloat
)
renderer
->
a
*
inv255f
);
glClear
(
GL_COLOR_BUFFER_BIT
);
return
0
;
}
static
int
static
int
GLES_RenderDrawPoints
(
SDL_Renderer
*
renderer
,
const
SDL_Point
*
points
,
GLES_RenderDrawPoints
(
SDL_Renderer
*
renderer
,
const
SDL_Point
*
points
,
int
count
)
int
count
)
...
@@ -505,14 +570,7 @@ GLES_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points,
...
@@ -505,14 +570,7 @@ GLES_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points,
int
i
;
int
i
;
GLshort
*
vertices
;
GLshort
*
vertices
;
GLES_ActivateRenderer
(
renderer
);
GLES_SetDrawingState
(
renderer
);
GLES_SetBlendMode
(
data
,
renderer
->
blendMode
);
glColor4f
((
GLfloat
)
renderer
->
r
*
inv255f
,
(
GLfloat
)
renderer
->
g
*
inv255f
,
(
GLfloat
)
renderer
->
b
*
inv255f
,
(
GLfloat
)
renderer
->
a
*
inv255f
);
vertices
=
SDL_stack_alloc
(
GLshort
,
count
*
2
);
vertices
=
SDL_stack_alloc
(
GLshort
,
count
*
2
);
for
(
i
=
0
;
i
<
count
;
++
i
)
{
for
(
i
=
0
;
i
<
count
;
++
i
)
{
...
@@ -534,14 +592,7 @@ GLES_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points,
...
@@ -534,14 +592,7 @@ GLES_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points,
int
i
;
int
i
;
GLshort
*
vertices
;
GLshort
*
vertices
;
GLES_ActivateRenderer
(
renderer
);
GLES_SetDrawingState
(
renderer
);
GLES_SetBlendMode
(
data
,
renderer
->
blendMode
);
glColor4f
((
GLfloat
)
renderer
->
r
*
inv255f
,
(
GLfloat
)
renderer
->
g
*
inv255f
,
(
GLfloat
)
renderer
->
b
*
inv255f
,
(
GLfloat
)
renderer
->
a
*
inv255f
);
vertices
=
SDL_stack_alloc
(
GLshort
,
count
*
2
);
vertices
=
SDL_stack_alloc
(
GLshort
,
count
*
2
);
for
(
i
=
0
;
i
<
count
;
++
i
)
{
for
(
i
=
0
;
i
<
count
;
++
i
)
{
...
@@ -569,14 +620,7 @@ GLES_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect * rects,
...
@@ -569,14 +620,7 @@ GLES_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect * rects,
GLES_RenderData
*
data
=
(
GLES_RenderData
*
)
renderer
->
driverdata
;
GLES_RenderData
*
data
=
(
GLES_RenderData
*
)
renderer
->
driverdata
;
int
i
;
int
i
;
GLES_ActivateRenderer
(
renderer
);
GLES_SetDrawingState
(
renderer
);
GLES_SetBlendMode
(
data
,
renderer
->
blendMode
);
glColor4f
((
GLfloat
)
renderer
->
r
*
inv255f
,
(
GLfloat
)
renderer
->
g
*
inv255f
,
(
GLfloat
)
renderer
->
b
*
inv255f
,
(
GLfloat
)
renderer
->
a
*
inv255f
);
for
(
i
=
0
;
i
<
count
;
++
i
)
{
for
(
i
=
0
;
i
<
count
;
++
i
)
{
const
SDL_Rect
*
rect
=
&
rects
[
i
];
const
SDL_Rect
*
rect
=
&
rects
[
i
];
...
@@ -614,21 +658,27 @@ GLES_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
...
@@ -614,21 +658,27 @@ GLES_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
GLES_ActivateRenderer
(
renderer
);
GLES_ActivateRenderer
(
renderer
);
glEnable
(
GL_TEXTURE_2D
);
glEnable
(
GL_TEXTURE_2D
);
glEnableClientState
(
GL_TEXTURE_COORD_ARRAY
);
glBindTexture
(
texturedata
->
type
,
texturedata
->
texture
);
glBindTexture
(
texturedata
->
type
,
texturedata
->
texture
);
if
(
texturedata
->
scaleMode
!=
data
->
current
.
scaleMode
)
{
glTexParameteri
(
texturedata
->
type
,
GL_TEXTURE_MIN_FILTER
,
texturedata
->
scaleMode
);
glTexParameteri
(
texturedata
->
type
,
GL_TEXTURE_MAG_FILTER
,
texturedata
->
scaleMode
);
data
->
current
.
scaleMode
=
texturedata
->
scaleMode
;
}
if
(
texture
->
modMode
)
{
if
(
texture
->
modMode
)
{
glColor4f
((
GLfloat
)
texture
->
r
*
inv255f
,
GLES_SetColor
(
data
,
texture
->
r
,
texture
->
g
,
texture
->
b
,
texture
->
a
);
(
GLfloat
)
texture
->
g
*
inv255f
,
(
GLfloat
)
texture
->
b
*
inv255f
,
(
GLfloat
)
texture
->
a
*
inv255f
);
}
else
{
}
else
{
glColor4f
(
1
.
0
f
,
1
.
0
f
,
1
.
0
f
,
1
.
0
f
);
GLES_SetColor
(
data
,
255
,
255
,
255
,
255
);
}
}
GLES_SetBlendMode
(
data
,
texture
->
blendMode
);
GLES_SetBlendMode
(
data
,
texture
->
blendMode
);
GLES_SetTexCoords
(
data
,
SDL_TRUE
);
if
(
data
->
GL_OES_draw_texture_supported
&&
data
->
useDrawTexture
)
{
if
(
data
->
GL_OES_draw_texture_supported
&&
data
->
useDrawTexture
)
{
/* this code is a little funny because the viewport is upside down vs SDL's coordinate system */
/* this code is a little funny because the viewport is upside down vs SDL's coordinate system */
GLint
cropRect
[
4
];
GLint
cropRect
[
4
];
...
@@ -685,8 +735,6 @@ GLES_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
...
@@ -685,8 +735,6 @@ GLES_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
glTexCoordPointer
(
2
,
GL_FLOAT
,
0
,
texCoords
);
glTexCoordPointer
(
2
,
GL_FLOAT
,
0
,
texCoords
);
glDrawArrays
(
GL_TRIANGLE_STRIP
,
0
,
4
);
glDrawArrays
(
GL_TRIANGLE_STRIP
,
0
,
4
);
}
}
glDisableClientState
(
GL_TEXTURE_COORD_ARRAY
);
glDisable
(
GL_TEXTURE_2D
);
glDisable
(
GL_TEXTURE_2D
);
return
0
;
return
0
;
...
...
src/render/opengles2/SDL_render_gles2.c
View file @
ee61cc31
...
@@ -58,6 +58,7 @@ typedef struct GLES2_TextureData
...
@@ -58,6 +58,7 @@ typedef struct GLES2_TextureData
GLenum
pixel_type
;
GLenum
pixel_type
;
void
*
pixel_data
;
void
*
pixel_data
;
size_t
pitch
;
size_t
pitch
;
GLenum
scaleMode
;
}
GLES2_TextureData
;
}
GLES2_TextureData
;
typedef
struct
GLES2_ShaderCacheEntry
typedef
struct
GLES2_ShaderCacheEntry
...
@@ -118,6 +119,12 @@ typedef enum
...
@@ -118,6 +119,12 @@ typedef enum
typedef
struct
GLES2_DriverContext
typedef
struct
GLES2_DriverContext
{
{
SDL_GLContext
*
context
;
SDL_GLContext
*
context
;
struct
{
int
blendMode
;
GLenum
scaleMode
;
SDL_bool
tex_coords
;
}
current
;
int
shader_format_count
;
int
shader_format_count
;
GLenum
*
shader_formats
;
GLenum
*
shader_formats
;
GLES2_ShaderCache
shader_cache
;
GLES2_ShaderCache
shader_cache
;
...
@@ -259,6 +266,7 @@ GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
...
@@ -259,6 +266,7 @@ GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
tdata
->
texture_type
=
GL_TEXTURE_2D
;
tdata
->
texture_type
=
GL_TEXTURE_2D
;
tdata
->
pixel_format
=
format
;
tdata
->
pixel_format
=
format
;
tdata
->
pixel_type
=
type
;
tdata
->
pixel_type
=
type
;
tdata
->
scaleMode
=
GL_LINEAR
;
/* Allocate a blob for image data */
/* Allocate a blob for image data */
if
(
texture
->
access
==
SDL_TEXTUREACCESS_STREAMING
)
if
(
texture
->
access
==
SDL_TEXTUREACCESS_STREAMING
)
...
@@ -787,43 +795,58 @@ GLES2_RenderClear(SDL_Renderer * renderer)
...
@@ -787,43 +795,58 @@ GLES2_RenderClear(SDL_Renderer * renderer)
}
}
static
void
static
void
GLES2_SetBlendMode
(
int
blendMode
)
GLES2_SetBlendMode
(
GLES2_DriverContext
*
rdata
,
int
blendMode
)
{
{
switch
(
blendMode
)
if
(
blendMode
!=
rdata
->
current
.
blendMode
)
{
{
switch
(
blendMode
)
{
case
SDL_BLENDMODE_NONE
:
default:
default:
case
SDL_BLENDMODE_NONE
:
glDisable
(
GL_BLEND
);
glDisable
(
GL_BLEND
);
break
;
break
;
case
SDL_BLENDMODE_BLEND
:
case
SDL_BLENDMODE_BLEND
:
glEnable
(
GL_BLEND
);
glEnable
(
GL_BLEND
);
glBlendFunc
(
GL_SRC_ALPHA
,
GL_ONE_MINUS_SRC_ALPHA
);
glBlendFunc
(
GL_SRC_ALPHA
,
GL_ONE_MINUS_SRC_ALPHA
);
break
;
break
;
case
SDL_BLENDMODE_ADD
:
case
SDL_BLENDMODE_ADD
:
glEnable
(
GL_BLEND
);
glEnable
(
GL_BLEND
);
glBlendFunc
(
GL_SRC_ALPHA
,
GL_ONE
);
glBlendFunc
(
GL_SRC_ALPHA
,
GL_ONE
);
break
;
break
;
case
SDL_BLENDMODE_MOD
:
case
SDL_BLENDMODE_MOD
:
glEnable
(
GL_BLEND
);
glEnable
(
GL_BLEND
);
glBlendFunc
(
GL_ZERO
,
GL_SRC_COLOR
);
glBlendFunc
(
GL_ZERO
,
GL_SRC_COLOR
);
break
;
break
;
}
rdata
->
current
.
blendMode
=
blendMode
;
}
}
static
void
GLES2_SetTexCoords
(
GLES2_DriverContext
*
rdata
,
SDL_bool
enabled
)
{
if
(
enabled
!=
rdata
->
current
.
tex_coords
)
{
if
(
enabled
)
{
glEnableVertexAttribArray
(
GLES2_ATTRIBUTE_TEXCOORD
);
}
else
{
glDisableVertexAttribArray
(
GLES2_ATTRIBUTE_TEXCOORD
);
}
rdata
->
current
.
tex_coords
=
enabled
;
}
}
}
}
static
int
static
int
GLES2_
RenderDrawPoints
(
SDL_Renderer
*
renderer
,
const
SDL_Point
*
points
,
int
count
)
GLES2_
SetDrawingState
(
SDL_Renderer
*
renderer
)
{
{
GLES2_DriverContext
*
rdata
=
(
GLES2_DriverContext
*
)
renderer
->
driverdata
;
GLES2_DriverContext
*
rdata
=
(
GLES2_DriverContext
*
)
renderer
->
driverdata
;
GLfloat
*
vertices
;
int
blendMode
=
renderer
->
blendMode
;
SDL_BlendMode
blendMode
;
int
alpha
;
GLuint
locColor
;
GLuint
locColor
;
int
idx
;
glGetError
();
GLES2_ActivateRenderer
(
renderer
);
GLES2_ActivateRenderer
(
renderer
);
blendMode
=
renderer
->
blendMode
;
GLES2_SetBlendMode
(
rdata
,
blendMode
);
alpha
=
renderer
->
a
;
GLES2_SetTexCoords
(
rdata
,
SDL_FALSE
);
/* Activate an appropriate shader and set the projection matrix */
/* Activate an appropriate shader and set the projection matrix */
if
(
GLES2_SelectProgram
(
renderer
,
GLES2_IMAGESOURCE_SOLID
,
blendMode
)
<
0
)
if
(
GLES2_SelectProgram
(
renderer
,
GLES2_IMAGESOURCE_SOLID
,
blendMode
)
<
0
)
...
@@ -831,15 +854,24 @@ GLES2_RenderDrawPoints(SDL_Renderer *renderer, const SDL_Point *points, int coun
...
@@ -831,15 +854,24 @@ GLES2_RenderDrawPoints(SDL_Renderer *renderer, const SDL_Point *points, int coun
/* Select the color to draw with */
/* Select the color to draw with */
locColor
=
rdata
->
current_program
->
uniform_locations
[
GLES2_UNIFORM_COLOR
];
locColor
=
rdata
->
current_program
->
uniform_locations
[
GLES2_UNIFORM_COLOR
];
glGetError
();
glUniform4f
(
locColor
,
glUniform4f
(
locColor
,
renderer
->
r
*
inv255f
,
renderer
->
r
*
inv255f
,
renderer
->
g
*
inv255f
,
renderer
->
g
*
inv255f
,
renderer
->
b
*
inv255f
,
renderer
->
b
*
inv255f
,
alpha
*
inv255f
);
renderer
->
a
*
inv255f
);
return
0
;
}
/* Configure the correct blend mode */
static
int
GLES2_SetBlendMode
(
blendMode
);
GLES2_RenderDrawPoints
(
SDL_Renderer
*
renderer
,
const
SDL_Point
*
points
,
int
count
)
{
GLES2_DriverContext
*
rdata
=
(
GLES2_DriverContext
*
)
renderer
->
driverdata
;
GLfloat
*
vertices
;
int
idx
;
if
(
GLES2_SetDrawingState
(
renderer
)
<
0
)
{
return
-
1
;
}
/* Emit the specified vertices as points */
/* Emit the specified vertices as points */
vertices
=
SDL_stack_alloc
(
GLfloat
,
count
*
2
);
vertices
=
SDL_stack_alloc
(
GLfloat
,
count
*
2
);
...
@@ -851,10 +883,9 @@ GLES2_RenderDrawPoints(SDL_Renderer *renderer, const SDL_Point *points, int coun
...
@@ -851,10 +883,9 @@ GLES2_RenderDrawPoints(SDL_Renderer *renderer, const SDL_Point *points, int coun
vertices
[
idx
*
2
]
=
x
;
vertices
[
idx
*
2
]
=
x
;
vertices
[(
idx
*
2
)
+
1
]
=
y
;
vertices
[(
idx
*
2
)
+
1
]
=
y
;
}
}
gl
EnableVertexAttribArray
(
GLES2_ATTRIBUTE_POSITION
);
gl
GetError
(
);
glVertexAttribPointer
(
GLES2_ATTRIBUTE_POSITION
,
2
,
GL_FLOAT
,
GL_FALSE
,
0
,
vertices
);
glVertexAttribPointer
(
GLES2_ATTRIBUTE_POSITION
,
2
,
GL_FLOAT
,
GL_FALSE
,
0
,
vertices
);
glDrawArrays
(
GL_POINTS
,
0
,
count
);
glDrawArrays
(
GL_POINTS
,
0
,
count
);
glDisableVertexAttribArray
(
GLES2_ATTRIBUTE_POSITION
);
SDL_stack_free
(
vertices
);
SDL_stack_free
(
vertices
);
if
(
glGetError
()
!=
GL_NO_ERROR
)
if
(
glGetError
()
!=
GL_NO_ERROR
)
{
{
...
@@ -869,31 +900,11 @@ GLES2_RenderDrawLines(SDL_Renderer *renderer, const SDL_Point *points, int count
...
@@ -869,31 +900,11 @@ GLES2_RenderDrawLines(SDL_Renderer *renderer, const SDL_Point *points, int count
{
{
GLES2_DriverContext
*
rdata
=
(
GLES2_DriverContext
*
)
renderer
->
driverdata
;
GLES2_DriverContext
*
rdata
=
(
GLES2_DriverContext
*
)
renderer
->
driverdata
;
GLfloat
*
vertices
;
GLfloat
*
vertices
;
SDL_BlendMode
blendMode
;
int
alpha
;
GLuint
locColor
;
int
idx
;
int
idx
;
GLES2_ActivateRenderer
(
renderer
);
if
(
GLES2_SetDrawingState
(
renderer
)
<
0
)
{
blendMode
=
renderer
->
blendMode
;
alpha
=
renderer
->
a
;
/* Activate an appropriate shader and set the projection matrix */
if
(
GLES2_SelectProgram
(
renderer
,
GLES2_IMAGESOURCE_SOLID
,
blendMode
)
<
0
)
return
-
1
;
return
-
1
;
}
/* Select the color to draw with */
locColor
=
rdata
->
current_program
->
uniform_locations
[
GLES2_UNIFORM_COLOR
];
glGetError
();
glUniform4f
(
locColor
,
renderer
->
r
*
inv255f
,
renderer
->
g
*
inv255f
,
renderer
->
b
*
inv255f
,
alpha
*
inv255f
);
/* Configure the correct blend mode */
GLES2_SetBlendMode
(
blendMode
);
/* Emit a line strip including the specified vertices */
/* Emit a line strip including the specified vertices */
vertices
=
SDL_stack_alloc
(
GLfloat
,
count
*
2
);
vertices
=
SDL_stack_alloc
(
GLfloat
,
count
*
2
);
...
@@ -905,10 +916,9 @@ GLES2_RenderDrawLines(SDL_Renderer *renderer, const SDL_Point *points, int count
...
@@ -905,10 +916,9 @@ GLES2_RenderDrawLines(SDL_Renderer *renderer, const SDL_Point *points, int count
vertices
[
idx
*
2
]
=
x
;
vertices
[
idx
*
2
]
=
x
;
vertices
[(
idx
*
2
)
+
1
]
=
y
;
vertices
[(
idx
*
2
)
+
1
]
=
y
;
}
}
gl
EnableVertexAttribArray
(
GLES2_ATTRIBUTE_POSITION
);
gl
GetError
(
);
glVertexAttribPointer
(
GLES2_ATTRIBUTE_POSITION
,
2
,
GL_FLOAT
,
GL_FALSE
,
0
,
vertices
);
glVertexAttribPointer
(
GLES2_ATTRIBUTE_POSITION
,
2
,
GL_FLOAT
,
GL_FALSE
,
0
,
vertices
);
glDrawArrays
(
GL_LINE_STRIP
,
0
,
count
);
glDrawArrays
(
GL_LINE_STRIP
,
0
,
count
);
glDisableVertexAttribArray
(
GLES2_ATTRIBUTE_POSITION
);
SDL_stack_free
(
vertices
);
SDL_stack_free
(
vertices
);
if
(
glGetError
()
!=
GL_NO_ERROR
)
if
(
glGetError
()
!=
GL_NO_ERROR
)
{
{
...
@@ -923,34 +933,14 @@ GLES2_RenderFillRects(SDL_Renderer *renderer, const SDL_Rect *rects, int count)
...
@@ -923,34 +933,14 @@ GLES2_RenderFillRects(SDL_Renderer *renderer, const SDL_Rect *rects, int count)
{
{
GLES2_DriverContext
*
rdata
=
(
GLES2_DriverContext
*
)
renderer
->
driverdata
;
GLES2_DriverContext
*
rdata
=
(
GLES2_DriverContext
*
)
renderer
->
driverdata
;
GLfloat
vertices
[
8
];
GLfloat
vertices
[
8
];
SDL_BlendMode
blendMode
;
int
alpha
;
GLuint
locColor
;
int
idx
;
int
idx
;
GLES2_ActivateRenderer
(
renderer
);
if
(
GLES2_SetDrawingState
(
renderer
)
<
0
)
{
blendMode
=
renderer
->
blendMode
;
alpha
=
renderer
->
a
;
/* Activate an appropriate shader and set the projection matrix */
if
(
GLES2_SelectProgram
(
renderer
,
GLES2_IMAGESOURCE_SOLID
,
blendMode
)
<
0
)
return
-
1
;
return
-
1
;
}
/* Select the color to draw with */
locColor
=
rdata
->
current_program
->
uniform_locations
[
GLES2_UNIFORM_COLOR
];
glGetError
();
glUniform4f
(
locColor
,
renderer
->
r
*
inv255f
,
renderer
->
g
*
inv255f
,
renderer
->
b
*
inv255f
,
alpha
*
inv255f
);
/* Configure the correct blend mode */
GLES2_SetBlendMode
(
blendMode
);
/* Emit a line loop for each rectangle */
/* Emit a line loop for each rectangle */
gl
EnableVertexAttribArray
(
GLES2_ATTRIBUTE_POSITION
);
gl
GetError
(
);
for
(
idx
=
0
;
idx
<
count
;
++
idx
)
{
for
(
idx
=
0
;
idx
<
count
;
++
idx
)
{
const
SDL_Rect
*
rect
=
&
rects
[
idx
];
const
SDL_Rect
*
rect
=
&
rects
[
idx
];
...
@@ -970,7 +960,6 @@ GLES2_RenderFillRects(SDL_Renderer *renderer, const SDL_Rect *rects, int count)
...
@@ -970,7 +960,6 @@ GLES2_RenderFillRects(SDL_Renderer *renderer, const SDL_Rect *rects, int count)
glVertexAttribPointer
(
GLES2_ATTRIBUTE_POSITION
,
2
,
GL_FLOAT
,
GL_FALSE
,
0
,
vertices
);
glVertexAttribPointer
(
GLES2_ATTRIBUTE_POSITION
,
2
,
GL_FLOAT
,
GL_FALSE
,
0
,
vertices
);
glDrawArrays
(
GL_TRIANGLE_STRIP
,
0
,
4
);
glDrawArrays
(
GL_TRIANGLE_STRIP
,
0
,
4
);
}
}
glDisableVertexAttribArray
(
GLES2_ATTRIBUTE_POSITION
);
if
(
glGetError
()
!=
GL_NO_ERROR
)
if
(
glGetError
()
!=
GL_NO_ERROR
)
{
{
SDL_SetError
(
"Failed to render lines"
);
SDL_SetError
(
"Failed to render lines"
);
...
@@ -987,7 +976,6 @@ GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *s
...
@@ -987,7 +976,6 @@ GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *s
GLES2_TextureData
*
tdata
=
(
GLES2_TextureData
*
)
texture
->
driverdata
;
GLES2_TextureData
*
tdata
=
(
GLES2_TextureData
*
)
texture
->
driverdata
;
GLES2_ImageSource
sourceType
;
GLES2_ImageSource
sourceType
;
SDL_BlendMode
blendMode
;
SDL_BlendMode
blendMode
;
int
alpha
;
GLfloat
vertices
[
8
];
GLfloat
vertices
[
8
];
GLfloat
texCoords
[
8
];
GLfloat
texCoords
[
8
];
GLuint
locTexture
;
GLuint
locTexture
;
...
@@ -997,7 +985,6 @@ GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *s
...
@@ -997,7 +985,6 @@ GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *s
/* Activate an appropriate shader and set the projection matrix */
/* Activate an appropriate shader and set the projection matrix */
blendMode
=
texture
->
blendMode
;
blendMode
=
texture
->
blendMode
;
alpha
=
texture
->
a
;
sourceType
=
GLES2_IMAGESOURCE_TEXTURE
;
sourceType
=
GLES2_IMAGESOURCE_TEXTURE
;
if
(
GLES2_SelectProgram
(
renderer
,
sourceType
,
blendMode
)
<
0
)
if
(
GLES2_SelectProgram
(
renderer
,
sourceType
,
blendMode
)
<
0
)
return
-
1
;
return
-
1
;
...
@@ -1009,8 +996,13 @@ GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *s
...
@@ -1009,8 +996,13 @@ GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *s
glBindTexture
(
tdata
->
texture_type
,
tdata
->
texture
);
glBindTexture
(
tdata
->
texture_type
,
tdata
->
texture
);
glUniform1i
(
locTexture
,
0
);
glUniform1i
(
locTexture
,
0
);
/* Configure texture blending */
if
(
tdata
->
scaleMode
!=
rdata
->
current
.
scaleMode
)
{
GLES2_SetBlendMode
(
blendMode
);
glTexParameteri
(
tdata
->
texture_type
,
GL_TEXTURE_MIN_FILTER
,
tdata
->
scaleMode
);
glTexParameteri
(
tdata
->
texture_type
,
GL_TEXTURE_MAG_FILTER
,
tdata
->
scaleMode
);
rdata
->
current
.
scaleMode
=
tdata
->
scaleMode
;
}
/* Configure color modulation */
/* Configure color modulation */
locModulation
=
rdata
->
current_program
->
uniform_locations
[
GLES2_UNIFORM_MODULATION
];
locModulation
=
rdata
->
current_program
->
uniform_locations
[
GLES2_UNIFORM_MODULATION
];
...
@@ -1018,11 +1010,14 @@ GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *s
...
@@ -1018,11 +1010,14 @@ GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *s
texture
->
r
*
inv255f
,
texture
->
r
*
inv255f
,
texture
->
g
*
inv255f
,
texture
->
g
*
inv255f
,
texture
->
b
*
inv255f
,
texture
->
b
*
inv255f
,
alpha
*
inv255f
);
texture
->
a
*
inv255f
);
/* Configure texture blending */
GLES2_SetBlendMode
(
rdata
,
blendMode
);
GLES2_SetTexCoords
(
rdata
,
SDL_TRUE
);
/* Emit the textured quad */
/* Emit the textured quad */
glEnableVertexAttribArray
(
GLES2_ATTRIBUTE_TEXCOORD
);
glEnableVertexAttribArray
(
GLES2_ATTRIBUTE_POSITION
);
vertices
[
0
]
=
(
GLfloat
)
dstrect
->
x
;
vertices
[
0
]
=
(
GLfloat
)
dstrect
->
x
;
vertices
[
1
]
=
(
GLfloat
)
dstrect
->
y
;
vertices
[
1
]
=
(
GLfloat
)
dstrect
->
y
;
vertices
[
2
]
=
(
GLfloat
)(
dstrect
->
x
+
dstrect
->
w
);
vertices
[
2
]
=
(
GLfloat
)(
dstrect
->
x
+
dstrect
->
w
);
...
@@ -1042,8 +1037,6 @@ GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *s
...
@@ -1042,8 +1037,6 @@ GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *s
texCoords
[
7
]
=
(
srcrect
->
y
+
srcrect
->
h
)
/
(
GLfloat
)
texture
->
h
;
texCoords
[
7
]
=
(
srcrect
->
y
+
srcrect
->
h
)
/
(
GLfloat
)
texture
->
h
;
glVertexAttribPointer
(
GLES2_ATTRIBUTE_TEXCOORD
,
2
,
GL_FLOAT
,
GL_FALSE
,
0
,
texCoords
);
glVertexAttribPointer
(
GLES2_ATTRIBUTE_TEXCOORD
,
2
,
GL_FLOAT
,
GL_FALSE
,
0
,
texCoords
);
glDrawArrays
(
GL_TRIANGLE_STRIP
,
0
,
4
);
glDrawArrays
(
GL_TRIANGLE_STRIP
,
0
,
4
);
glDisableVertexAttribArray
(
GLES2_ATTRIBUTE_POSITION
);
glDisableVertexAttribArray
(
GLES2_ATTRIBUTE_TEXCOORD
);
if
(
glGetError
()
!=
GL_NO_ERROR
)
if
(
glGetError
()
!=
GL_NO_ERROR
)
{
{
SDL_SetError
(
"Failed to render texture"
);
SDL_SetError
(
"Failed to render texture"
);
...
@@ -1067,6 +1060,25 @@ GLES2_RenderPresent(SDL_Renderer *renderer)
...
@@ -1067,6 +1060,25 @@ GLES2_RenderPresent(SDL_Renderer *renderer)
#define GL_NVIDIA_PLATFORM_BINARY_NV 0x890B
#define GL_NVIDIA_PLATFORM_BINARY_NV 0x890B
static
void
GLES2_ResetState
(
SDL_Renderer
*
renderer
)
{
GLES2_DriverContext
*
rdata
=
(
GLES2_DriverContext
*
)
renderer
->
driverdata
;
if
(
SDL_CurrentContext
==
rdata
->
context
)
{
GLES2_UpdateViewport
(
renderer
);
}
else
{
GLES2_ActivateRenderer
(
renderer
);
}
rdata
->
current
.
blendMode
=
-
1
;
rdata
->
current
.
scaleMode
=
0
;
rdata
->
current
.
tex_coords
=
SDL_FALSE
;
glEnableVertexAttribArray
(
GLES2_ATTRIBUTE_POSITION
);
glDisableVertexAttribArray
(
GLES2_ATTRIBUTE_TEXCOORD
);
}
static
SDL_Renderer
*
static
SDL_Renderer
*
GLES2_CreateRenderer
(
SDL_Window
*
window
,
Uint32
flags
)
GLES2_CreateRenderer
(
SDL_Window
*
window
,
Uint32
flags
)
{
{
...
@@ -1166,6 +1178,9 @@ GLES2_CreateRenderer(SDL_Window *window, Uint32 flags)
...
@@ -1166,6 +1178,9 @@ GLES2_CreateRenderer(SDL_Window *window, Uint32 flags)
renderer
->
RenderPresent
=
&
GLES2_RenderPresent
;
renderer
->
RenderPresent
=
&
GLES2_RenderPresent
;
renderer
->
DestroyTexture
=
&
GLES2_DestroyTexture
;
renderer
->
DestroyTexture
=
&
GLES2_DestroyTexture
;
renderer
->
DestroyRenderer
=
&
GLES2_DestroyRenderer
;
renderer
->
DestroyRenderer
=
&
GLES2_DestroyRenderer
;
GLES2_ResetState
(
renderer
);
return
renderer
;
return
renderer
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment