Skip to content

Commit 1d02161

Browse files
committed
NME_GLES3
Initial GLES3. All changes are within a "#define NME_GLES3" and it is not activated so it doesn't modify current behaivor. To use it, build nme/project with -DNME_GLES3 flag or uncomment on ToolkitBuild.xml Then use -Dgles3 flag when compiling a haxe NME sample. Tested on Windows (Angle) with https://github.com/madrazo/nme-opengl-tutorials tutorials 1 to 5, with both -Dgles3 and without (current gles2). Needs patch for SDL nme-toolkit: native-toolkit/libsdl#11
1 parent 0905817 commit 1d02161

File tree

8 files changed

+158
-13
lines changed

8 files changed

+158
-13
lines changed

project/ToolkitBuild.xml

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,22 @@
44
<set name="mac" value="1" if="macos" />
55
<set name="native_toolkit_sdl_static" value="1" if="static_link" />
66

7+
8+
<set name="NME_ANGLE" value="1" if="windows||winrt" unless="NME_NO_ANGLE" />
9+
<set name="NATIVE_TOOLKIT_SDL_ANGLE" value="1" if="NME_ANGLE" />
10+
<set name="NATIVE_TOOLKIT_STATIC_ANGLE" value="1" if="NME_ANGLE" />
11+
12+
<!-- Uncomment to default GLES3 compatibility-->
13+
<!--<set name="NME_GLES3" value="1" if="NME_ANGLE" unless="NME_FORCE_GLES2"/>-->
14+
<!--<set name="NME_GLES3" value="1" unless="NME_FORCE_GLES2"/>-->
15+
716
<!-- Require Android 2.3+ -->
8-
<set name="PLATFORM" value="android-9" if="android" />
9-
<set name="PLATFORM" value="android-14" if="HXCPP_X86" />
10-
<set name="PLATFORM" value="android-21" if="HXCPP_ARM64" />
17+
<section if="android">
18+
<set name="PLATFORM" value="android-9"/>
19+
<set name="PLATFORM" value="android-14" if="HXCPP_X86" />
20+
<set name="PLATFORM" value="android-18" if="NME_GLES3"/>
21+
<set name="PLATFORM" value="android-21" if="HXCPP_ARM64" />
22+
</section>
1123
<set name="HXCPP_CPP11" value="1" />
1224

1325
<set name="exe_link" value="1" if="HXCPP_JS_PRIME" />
@@ -20,10 +32,6 @@
2032
<set name="rpi" value="1" if="winrpi" />
2133
<set name="sdl_rpi" value="1" if="winrpi" />
2234

23-
<set name="NME_ANGLE" value="1" if="windows||winrt" unless="NME_NO_ANGLE" />
24-
<set name="NATIVE_TOOLKIT_SDL_ANGLE" value="1" if="NME_ANGLE" />
25-
<set name="NATIVE_TOOLKIT_STATIC_ANGLE" value="1" if="NME_ANGLE" />
26-
2735
<include name="${HXCPP}/build-tool/BuildCommon.xml"/>
2836
<!--
2937
Build with:
@@ -205,6 +213,7 @@
205213
<compilerflag value="-DNME_WORKER_THREADS" if="NME_WORKER_THREADS" />
206214
<compilerflag value="-DNME_ANGLE" if="NME_ANGLE" />
207215
<compilerflag value="-I${ANGLE_DIR}/include" if="NME_ANGLE" />
216+
<compilerflag value="-DNME_GLES3" if="NME_GLES3" />
208217

209218
<cache value="1" unless="winrpi" />
210219
<cache value="1" asLibrary="true" if="winrpi" />
@@ -496,20 +505,23 @@
496505
<section if="android">
497506
<lib name="-ldl" />
498507
<lib name="-landroid" />
499-
<lib name="-lGLESv2" />
508+
<lib name="-lGLESv2" unless="NME_GLES3"/>
509+
<lib name="-lGLESv3" if="NME_GLES3"/>
500510
<lib name="-lEGL" />
501511
<lib name="-lz" />
502512
</section>
503513

504514
<section if="rpi" unless="winrpi" >
505-
<lib name="/opt/vc/lib/libGLESv2.so" />
515+
<lib name="/opt/vc/lib/libGLESv2.so" unless="NME_GLES3"/>
516+
<lib name="/opt/vc/lib/libGLESv3.so" if="NME_GLES3"/>
506517
<lib name="/opt/vc/lib/libEGL.so" />
507518
<lib name="/opt/vc/lib/libbcm_host.so" />
508519
</section>
509520

510521
<section if="rpi winrpi" >
511522
<libpath name="${haxelib:winrpi}/lib" />
512-
<lib name="-lGLESv2" />
523+
<lib name="-lGLESv2" unless="NME_GLES3"/>
524+
<lib name="-lGLESv3" if="NME_GLES3"/>
513525
<lib name="-lEGL" />
514526
<lib name="-lvcos" />
515527
<lib name="-lvchiq_arm" />

project/include/Hardware.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ class HardwareRenderer : public HardwareContext
130130
virtual void DestroyShader(unsigned int inShader)=0;
131131
virtual void DestroyFramebuffer(unsigned int inBuffer)=0;
132132
virtual void DestroyRenderbuffer(unsigned int inBuffer)=0;
133+
#ifdef NME_GLES3
134+
virtual void DestroyVertexarray(unsigned int inBuffer)=0;
135+
#endif
133136

134137
#ifdef NME_S3D
135138
virtual void EndS3DRender()=0;

project/src/opengl/OGL.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,20 @@
88
#define NME_GLES
99
#define GL_GLEXT_PROTOTYPES
1010

11+
#ifdef NME_GLES3
12+
#include <GLES3/gl3.h>
13+
#endif
1114
#include <GLES2/gl2.h>
1215
#include <GLES2/gl2ext.h>
1316

1417
#elif defined(BLACKBERRY) || defined(ANDROID) || defined(WEBOS) || defined(GPH) || defined(RASPBERRYPI) || defined(EMSCRIPTEN)
1518

1619
#define NME_GLES
1720

21+
#ifdef NME_GLES3
22+
#include <GLES3/gl3.h>
23+
#define __gl2_h_ //Not needed for Android Platform >= 21
24+
#endif
1825
#include <GLES2/gl2.h>
1926
#include <GLES2/gl2ext.h>
2027

@@ -31,6 +38,10 @@
3138
#include <OpenGLES/ES1/glext.h>
3239
#include <OpenGLES/ES2/gl.h>
3340
#include <OpenGLES/ES2/glext.h>
41+
#ifdef NME_GLES3
42+
#include <OpenGLES/ES3/gl.h>
43+
#include <OpenGLES/ES3/glext.h>
44+
#endif
3445

3546
//typedef CAEAGLLayer *WinDC;
3647
//typedef EAGLContext *GLCtx;

project/src/opengl/OGLExport.cpp

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ enum ResoType
4646
resoProgram, //4
4747
resoFramebuffer, //5
4848
resoRenderbuffer, //6
49+
#ifdef NME_GLES3
50+
resoVertexarray, //7
51+
#endif
4952
};
5053

5154
const char *getTypeString(int inType)
@@ -59,6 +62,9 @@ const char *getTypeString(int inType)
5962
case resoProgram: return "Program";
6063
case resoFramebuffer: return "Framebuffer";
6164
case resoRenderbuffer: return "Renderbuffer";
65+
#ifdef NME_GLES3
66+
case resoVertexarray: return "Vertexarray";
67+
#endif
6268
}
6369
return "Unknown";
6470
}
@@ -306,6 +312,11 @@ class NmeResource : public nme::Object
306312
case resoRenderbuffer:
307313
ctx->DestroyRenderbuffer(id);
308314
break;
315+
#ifdef NME_GLES3
316+
case resoVertexarray:
317+
ctx->DestroyVertexarray(id);
318+
break;
319+
#endif
309320
}
310321
}
311322
type = resoNone;
@@ -793,7 +804,9 @@ GL_GEN_RESO(buffer,glGenBuffers,resoBuffer)
793804

794805
GL_GEN_RESO(framebuffer,glGenFramebuffers,resoFramebuffer)
795806
GL_GEN_RESO(render_buffer,glGenRenderbuffers,resoRenderbuffer)
796-
807+
#ifdef NME_GLES3
808+
GL_GEN_RESO(vertexarray,glGenVertexArrays,resoVertexarray)
809+
#endif
797810

798811
// --- Stencil -------------------------------------------
799812

@@ -1374,6 +1387,13 @@ value nme_gl_shader_source(value inId,value inSource)
13741387
int id = getResource(inId,resoShader);
13751388
HxString source = valToHxString(inSource);
13761389
const char *lines = source.c_str();
1390+
1391+
#ifdef NME_GLES3
1392+
if (strcmp("#version", lines)) {
1393+
glShaderSource(id,1,&lines,0);
1394+
return alloc_null();
1395+
}
1396+
#endif
13771397
#ifdef NME_GLES
13781398
// TODO - do something better here
13791399
std::string buffer;
@@ -1756,6 +1776,19 @@ value nme_gl_get_render_buffer_parameter(value target, value pname)
17561776
}
17571777
DEFINE_PRIM(nme_gl_get_render_buffer_parameter,2);
17581778

1779+
1780+
1781+
#ifdef NME_GLES3
1782+
value nme_gl_bind_vertexarray(value inId )
1783+
{
1784+
int id = getResourceId(inId,resoVertexarray);
1785+
glBindVertexArray(id);
1786+
return alloc_null();
1787+
}
1788+
DEFINE_PRIM(nme_gl_bind_vertexarray,1);
1789+
#endif
1790+
1791+
17591792
// --- Drawing -------------------------------
17601793

17611794

project/src/opengl/OpenGLContext.cpp

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,18 @@ class OGLContext : public HardwareRenderer
155155
glDeleteRenderbuffers(1,&inBuffer);
156156
}
157157

158+
#ifdef NME_GLES3
159+
void DestroyVertexarray(unsigned int inBuffer)
160+
{
161+
if ( !IsMainThread() )
162+
{
163+
mHasZombie = true;
164+
mZombieVertexarrays.push_back(inBuffer);
165+
}
166+
else
167+
glDeleteVertexArrays(1,&inBuffer);
168+
}
169+
#endif
158170

159171
void OnContextLost()
160172
{
@@ -164,6 +176,9 @@ class OGLContext : public HardwareRenderer
164176
mZombieShaders.resize(0);
165177
mZombieFramebuffers.resize(0);
166178
mZombieRenderbuffers.resize(0);
179+
#ifdef NME_GLES3
180+
mZombieVertexarrays.resize(0);
181+
#endif
167182
mHasZombie = false;
168183
}
169184

@@ -277,6 +292,15 @@ class OGLContext : public HardwareRenderer
277292
glDeleteRenderbuffers(mZombieRenderbuffers.size(),&mZombieRenderbuffers[0]);
278293
mZombieRenderbuffers.resize(0);
279294
}
295+
#ifdef NME_GLES3
296+
if (mZombieVertexarrays.size())
297+
{
298+
#ifndef NME_NO_GLES3COMPAT
299+
glDeleteVertexArrays(mZombieVertexarrays.size(),&mZombieVertexarrays[0]);
300+
#endif
301+
mZombieVertexarrays.resize(0);
302+
}
303+
#endif
280304
}
281305

282306

@@ -316,7 +340,9 @@ class OGLContext : public HardwareRenderer
316340
mZombieShaders.resize(0);
317341
mZombieFramebuffers.resize(0);
318342
mZombieRenderbuffers.resize(0);
319-
343+
#ifdef NME_GLES3
344+
mZombieVertexarrays.resize(0);
345+
#endif
320346
ReloadExtentions();
321347
}
322348

@@ -771,6 +797,9 @@ class OGLContext : public HardwareRenderer
771797
QuickVec<GLuint> mZombieShaders;
772798
QuickVec<GLuint> mZombieFramebuffers;
773799
QuickVec<GLuint> mZombieRenderbuffers;
800+
#ifdef NME_GLES3
801+
QuickVec<GLuint> mZombieVertexarrays;
802+
#endif
774803

775804
GPUProg *mProg[PROG_COUNT];
776805

project/src/sdl2/SDL2Stage.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1809,9 +1809,13 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight,
18091809
if (fullscreen) requestWindowFlags |= FullscreenMode; //SDL_WINDOW_FULLSCREEN_DESKTOP;
18101810

18111811
#ifdef NME_ANGLE
1812+
int major = 2;
1813+
#ifdef NME_GLES3
1814+
major = 3;
1815+
#endif
18121816
SDL_GL_SetAttribute(SDL_GL_CONTEXT_EGL, 1);
18131817
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
1814-
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
1818+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
18151819
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
18161820
#endif
18171821

@@ -1944,6 +1948,16 @@ void CreateMainFrame(FrameCreationCallback inOnFrame, int inWidth, int inHeight,
19441948
sgIsOGL2 = false;
19451949
}
19461950

1951+
#if defined(NME_ANGLE) && defined(NME_GLES3)
1952+
if (!renderer && opengl && major>2)
1953+
{
1954+
fprintf(stderr, "GLES3 is not available. Retrying with GLES2. (%s)\n", SDL_GetError());
1955+
major = 2;
1956+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
1957+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
1958+
}
1959+
else
1960+
#endif
19471961
if (!renderer && (inFlags & wfHW_AA_HIRES || inFlags & wfHW_AA)) {
19481962
// if no window was created and AA was enabled, disable AA and try again
19491963
fprintf(stderr, "Multisampling is not available. Retrying without. (%s)\n", SDL_GetError());

src/nme/gl/GL3.hx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package nme.gl;
2+
3+
@:nativeProperty
4+
class GL3
5+
{
6+
#if (gles3 && !flash)
7+
8+
public static inline function bindVertexArray(vertexarray:GLVertexArray):Void
9+
{
10+
nme_gl_bind_vertexarray(vertexarray);
11+
}
12+
13+
public static inline function createVertexArray():GLVertexArray
14+
{
15+
return new GLVertexArray(GL.version, nme_gl_create_vertexarray());
16+
}
17+
18+
19+
// Native Methods
20+
private static var nme_gl_create_vertexarray = GL.load("nme_gl_create_vertexarray", 0);
21+
private static var nme_gl_bind_vertexarray = GL.load("nme_gl_bind_vertexarray", 1);
22+
23+
#end
24+
}
25+

src/nme/gl/GLVertexArray.hx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package nme.gl;
2+
#if (gles3 && !flash)
3+
4+
@:nativeProperty
5+
class GLVertexArray extends GLObject
6+
{
7+
public function new(inVersion:Int, inId:Dynamic)
8+
{
9+
super(inVersion, inId);
10+
}
11+
12+
override function getType():String
13+
{
14+
return "VertexArray";
15+
}
16+
}
17+
18+
#end

0 commit comments

Comments
 (0)