mirror of https://github.com/buggins/dlangui.git
Android support; now can show window -- #119
This commit is contained in:
parent
1911c75765
commit
b528a96e3b
|
@ -28,7 +28,7 @@ int __android_log_print(int prio, const(char)* tag, const(char)* fmt, ...);
|
||||||
int __android_log_vprint(int prio, const(char)* tag, const(char)* fmt, va_list ap);
|
int __android_log_vprint(int prio, const(char)* tag, const(char)* fmt, va_list ap);
|
||||||
void __android_log_assert(const(char)* cond, const(char)* tag, const(char)* fmt, ...);
|
void __android_log_assert(const(char)* cond, const(char)* tag, const(char)* fmt, ...);
|
||||||
|
|
||||||
__gshared const(char) * ANDROID_LOG_TAG = "dlangui_app";
|
__gshared const(char) * ANDROID_LOG_TAG = "dlangui";
|
||||||
|
|
||||||
void LOGI(S...)(const(char) * fmt, S args) {
|
void LOGI(S...)(const(char) * fmt, S args) {
|
||||||
__android_log_print(android_LogPriority.ANDROID_LOG_INFO, ANDROID_LOG_TAG, fmt, args);
|
__android_log_print(android_LogPriority.ANDROID_LOG_INFO, ANDROID_LOG_TAG, fmt, args);
|
||||||
|
|
|
@ -74,7 +74,7 @@ mkdir -p build/$PLATFORM_DIR/
|
||||||
|
|
||||||
echo "\nCompiling $OBJFILE...\n"
|
echo "\nCompiling $OBJFILE...\n"
|
||||||
#=========================================================
|
#=========================================================
|
||||||
$LDC/bin/ldc2 $LDC_PARAMS $SOURCE_PATHS $SOURCES -c -singleobj -of=$OBJFILE || die 2 "ldc2 build for $OBJFILE is failed"
|
$LDC/bin/ldc2 $LDC_PARAMS $SOURCE_PATHS $SOURCES -d-debug -d-version=EmbedStandardResources -c -singleobj -of=$OBJFILE || die 2 "ldc2 build for $OBJFILE is failed"
|
||||||
|
|
||||||
echo "\n\nLinking $TARGET...\n"
|
echo "\n\nLinking $TARGET...\n"
|
||||||
#=========================================================
|
#=========================================================
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
version(Android):
|
//version(Android):
|
||||||
|
|
||||||
import core.stdc.stdlib : malloc;
|
import core.stdc.stdlib : malloc;
|
||||||
import core.stdc.string : memset;
|
import core.stdc.string : memset;
|
||||||
|
@ -142,12 +142,13 @@ class AndroidPlatform : Platform {
|
||||||
*/
|
*/
|
||||||
int engine_init_display() {
|
int engine_init_display() {
|
||||||
// initialize OpenGL ES and EGL
|
// initialize OpenGL ES and EGL
|
||||||
|
Log.i("engine_init_display");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Here specify the attributes of the desired configuration.
|
* Here specify the attributes of the desired configuration.
|
||||||
* Below, we select an EGLConfig with at least 8 bits per color
|
* Below, we select an EGLConfig with at least 8 bits per color
|
||||||
* component compatible with on-screen windows
|
* component compatible with on-screen windows
|
||||||
*/
|
*/
|
||||||
const(EGLint)[9] attribs = [
|
const(EGLint)[9] attribs = [
|
||||||
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
||||||
EGL_BLUE_SIZE, 8,
|
EGL_BLUE_SIZE, 8,
|
||||||
|
@ -179,7 +180,8 @@ class AndroidPlatform : Platform {
|
||||||
ANativeWindow_setBuffersGeometry(_appstate.window, 0, 0, format);
|
ANativeWindow_setBuffersGeometry(_appstate.window, 0, 0, format);
|
||||||
|
|
||||||
surface = eglCreateWindowSurface(display, config, _appstate.window, null);
|
surface = eglCreateWindowSurface(display, config, _appstate.window, null);
|
||||||
context = eglCreateContext(display, config, null, null);
|
EGLint[3] contextAttrs = [EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE];
|
||||||
|
context = eglCreateContext(display, config, null, contextAttrs.ptr);
|
||||||
|
|
||||||
if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
|
if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
|
||||||
LOGW("Unable to eglMakeCurrent");
|
LOGW("Unable to eglMakeCurrent");
|
||||||
|
@ -214,6 +216,7 @@ class AndroidPlatform : Platform {
|
||||||
* Tear down the EGL context currently associated with the display.
|
* Tear down the EGL context currently associated with the display.
|
||||||
*/
|
*/
|
||||||
void engine_term_display() {
|
void engine_term_display() {
|
||||||
|
Log.i("engine_term_display");
|
||||||
if (_display != EGL_NO_DISPLAY) {
|
if (_display != EGL_NO_DISPLAY) {
|
||||||
eglMakeCurrent(_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
eglMakeCurrent(_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||||
if (_context != EGL_NO_CONTEXT) {
|
if (_context != EGL_NO_CONTEXT) {
|
||||||
|
@ -234,6 +237,7 @@ class AndroidPlatform : Platform {
|
||||||
* Process the next input event.
|
* Process the next input event.
|
||||||
*/
|
*/
|
||||||
int handle_input(AInputEvent* event) {
|
int handle_input(AInputEvent* event) {
|
||||||
|
Log.i("handle input, event=", AInputEvent_getType(event));
|
||||||
if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
|
if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
|
||||||
_engine.animating = 1;
|
_engine.animating = 1;
|
||||||
_engine.state.x = AMotionEvent_getX(event, 0);
|
_engine.state.x = AMotionEvent_getX(event, 0);
|
||||||
|
@ -247,6 +251,7 @@ class AndroidPlatform : Platform {
|
||||||
* Process the next main command.
|
* Process the next main command.
|
||||||
*/
|
*/
|
||||||
void handle_cmd(int cmd) {
|
void handle_cmd(int cmd) {
|
||||||
|
Log.i("handle cmd=", cmd);
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case APP_CMD_SAVE_STATE:
|
case APP_CMD_SAVE_STATE:
|
||||||
// The system has asked us to save our current state. Do so.
|
// The system has asked us to save our current state. Do so.
|
||||||
|
@ -332,6 +337,7 @@ class AndroidPlatform : Platform {
|
||||||
|
|
||||||
GLDrawBuf _drawbuf;
|
GLDrawBuf _drawbuf;
|
||||||
void drawWindow(AndroidWindow w = null) {
|
void drawWindow(AndroidWindow w = null) {
|
||||||
|
Log.i("drawWindow");
|
||||||
if (w is null)
|
if (w is null)
|
||||||
w = activeWindow;
|
w = activeWindow;
|
||||||
else if (!(activeWindow is w))
|
else if (!(activeWindow is w))
|
||||||
|
@ -528,7 +534,9 @@ extern (C) void android_main(android_app* state) {
|
||||||
|
|
||||||
version (unittest) {
|
version (unittest) {
|
||||||
} else {
|
} else {
|
||||||
|
Log.i("Calling UIAppMain");
|
||||||
res = UIAppMain([]);
|
res = UIAppMain([]);
|
||||||
|
Log.i("UIAppMain returned with resultCode=", res);
|
||||||
}
|
}
|
||||||
|
|
||||||
// loop waiting for stuff to do.
|
// loop waiting for stuff to do.
|
||||||
|
|
|
@ -74,6 +74,9 @@ import dlangui.graphics.scene.mesh;
|
||||||
import dlangui.graphics.scene.effect;
|
import dlangui.graphics.scene.effect;
|
||||||
|
|
||||||
|
|
||||||
|
//extern (C) void func(int n);
|
||||||
|
//pragma(msg, __traits(identifier, func));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convenient wrapper around glGetError()
|
* Convenient wrapper around glGetError()
|
||||||
* Using: checkgl!glFunction(funcParams);
|
* Using: checkgl!glFunction(funcParams);
|
||||||
|
@ -83,7 +86,11 @@ template checkgl(alias func)
|
||||||
{
|
{
|
||||||
debug auto checkgl(string functionName=__FUNCTION__, int line=__LINE__, Args...)(Args args)
|
debug auto checkgl(string functionName=__FUNCTION__, int line=__LINE__, Args...)(Args args)
|
||||||
{
|
{
|
||||||
scope(success) checkError(func.stringof, functionName, line);
|
version (Android) {
|
||||||
|
scope(success) checkError(__traits(identifier, func), functionName, line);
|
||||||
|
} else {
|
||||||
|
scope(success) checkError(func.stringof, functionName, line);
|
||||||
|
}
|
||||||
return func(args);
|
return func(args);
|
||||||
} else
|
} else
|
||||||
alias checkgl = func;
|
alias checkgl = func;
|
||||||
|
@ -169,40 +176,42 @@ class GLProgram : dlangui.graphics.scene.mesh.GraphicsEffect {
|
||||||
import std.string : toStringz, fromStringz;
|
import std.string : toStringz, fromStringz;
|
||||||
|
|
||||||
char[] sourceCode;
|
char[] sourceCode;
|
||||||
sourceCode ~= "#version ";
|
if (glslversionString.length) {
|
||||||
sourceCode ~= glslversionString;
|
sourceCode ~= "#version ";
|
||||||
sourceCode ~= "\n";
|
sourceCode ~= glslversionString;
|
||||||
|
sourceCode ~= "\n";
|
||||||
|
}
|
||||||
sourceCode ~= src;
|
sourceCode ~= src;
|
||||||
compatibilityFixes(sourceCode, type);
|
compatibilityFixes(sourceCode, type);
|
||||||
|
|
||||||
Log.d("compileShader: glsl = ", glslversion, ", type: ", (type == GL_VERTEX_SHADER ? "GL_VERTEX_SHADER" : (type == GL_FRAGMENT_SHADER ? "GL_FRAGMENT_SHADER" : "UNKNOWN")));
|
Log.d("compileShader: glslVersion = ", glslversion, ", type: ", (type == GL_VERTEX_SHADER ? "GL_VERTEX_SHADER" : (type == GL_FRAGMENT_SHADER ? "GL_FRAGMENT_SHADER" : "UNKNOWN")));
|
||||||
//Log.v("Shader code:\n", sourceCode);
|
//Log.v("Shader code:\n", sourceCode);
|
||||||
GLuint shader = glCreateShader(type);
|
GLuint shader = checkgl!glCreateShader(type);
|
||||||
const char * psrc = sourceCode.toStringz;
|
const char * psrc = sourceCode.toStringz;
|
||||||
glShaderSource(shader, 1, &psrc, null);
|
checkgl!glShaderSource(shader, 1, &psrc, null);
|
||||||
glCompileShader(shader);
|
checkgl!glCompileShader(shader);
|
||||||
GLint compiled;
|
GLint compiled;
|
||||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
|
checkgl!glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
|
||||||
if (compiled) {
|
if (compiled) {
|
||||||
// compiled successfully
|
// compiled successfully
|
||||||
return shader;
|
return shader;
|
||||||
} else {
|
} else {
|
||||||
|
Log.e("Failed to compile shader source:\n", sourceCode);
|
||||||
GLint blen = 0;
|
GLint blen = 0;
|
||||||
GLsizei slen = 0;
|
GLsizei slen = 0;
|
||||||
glGetShaderiv(shader, GL_INFO_LOG_LENGTH , &blen);
|
checkgl!glGetShaderiv(shader, GL_INFO_LOG_LENGTH , &blen);
|
||||||
if (blen > 1)
|
if (blen > 1)
|
||||||
{
|
{
|
||||||
GLchar[] msg = new GLchar[blen + 1];
|
GLchar[] msg = new GLchar[blen + 1];
|
||||||
glGetShaderInfoLog(shader, blen, &slen, msg.ptr);
|
checkgl!glGetShaderInfoLog(shader, blen, &slen, msg.ptr);
|
||||||
Log.d("Shader compilation error: ", fromStringz(msg.ptr));
|
Log.e("Shader compilation error: ", fromStringz(msg.ptr));
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool compile() {
|
bool compile() {
|
||||||
glslversion = std.string.fromStringz(cast(const char *)glGetString(GL_SHADING_LANGUAGE_VERSION)).dup;
|
glslversion = checkgl!fromStringz(cast(const char *)glGetString(GL_SHADING_LANGUAGE_VERSION)).dup;
|
||||||
|
|
||||||
glslversionString.length = 0;
|
glslversionString.length = 0;
|
||||||
glslversionInt = 0;
|
glslversionInt = 0;
|
||||||
foreach(ch; glslversion) {
|
foreach(ch; glslversion) {
|
||||||
|
@ -212,6 +221,9 @@ class GLProgram : dlangui.graphics.scene.mesh.GraphicsEffect {
|
||||||
} else if (ch != '.')
|
} else if (ch != '.')
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
version (Android) {
|
||||||
|
glslversionInt = 130;
|
||||||
|
}
|
||||||
|
|
||||||
vertexShader = compileShader(vertexSource, GL_VERTEX_SHADER);
|
vertexShader = compileShader(vertexSource, GL_VERTEX_SHADER);
|
||||||
fragmentShader = compileShader(fragmentSource, GL_FRAGMENT_SHADER);
|
fragmentShader = compileShader(fragmentSource, GL_FRAGMENT_SHADER);
|
||||||
|
@ -219,17 +231,17 @@ class GLProgram : dlangui.graphics.scene.mesh.GraphicsEffect {
|
||||||
error = true;
|
error = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
program = glCreateProgram();
|
program = checkgl!glCreateProgram();
|
||||||
glAttachShader(program, vertexShader);
|
checkgl!glAttachShader(program, vertexShader);
|
||||||
glAttachShader(program, fragmentShader);
|
checkgl!glAttachShader(program, fragmentShader);
|
||||||
glLinkProgram(program);
|
checkgl!glLinkProgram(program);
|
||||||
GLint isLinked = 0;
|
GLint isLinked = 0;
|
||||||
glGetProgramiv(program, GL_LINK_STATUS, &isLinked);
|
checkgl!glGetProgramiv(program, GL_LINK_STATUS, &isLinked);
|
||||||
if (!isLinked) {
|
if (!isLinked) {
|
||||||
GLint maxLength = 0;
|
GLint maxLength = 0;
|
||||||
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
|
checkgl!glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
|
||||||
GLchar[] msg = new GLchar[maxLength + 1];
|
GLchar[] msg = new GLchar[maxLength + 1];
|
||||||
glGetProgramInfoLog(program, maxLength, &maxLength, msg.ptr);
|
checkgl!glGetProgramInfoLog(program, maxLength, &maxLength, msg.ptr);
|
||||||
Log.e("Error while linking program: ", fromStringz(msg.ptr));
|
Log.e("Error while linking program: ", fromStringz(msg.ptr));
|
||||||
error = true;
|
error = true;
|
||||||
return false;
|
return false;
|
||||||
|
@ -1309,7 +1321,7 @@ class GLVertexBuffer : VertexBuffer {
|
||||||
for(int i = 0; i < _format.length; i++) {
|
for(int i = 0; i < _format.length; i++) {
|
||||||
int loc = effect.getVertexElementLocation(_format[i].type);
|
int loc = effect.getVertexElementLocation(_format[i].type);
|
||||||
if (loc >= 0) {
|
if (loc >= 0) {
|
||||||
checkgl!glVertexAttribPointer(loc, _format[i].size, GL_FLOAT, GL_FALSE, _format.vertexSize, cast(char*)(offset));
|
checkgl!glVertexAttribPointer(loc, _format[i].size, GL_FLOAT, cast(ubyte)GL_FALSE, _format.vertexSize, cast(char*)(offset));
|
||||||
checkgl!glEnableVertexAttribArray(loc);
|
checkgl!glEnableVertexAttribArray(loc);
|
||||||
} else {
|
} else {
|
||||||
//Log.d("Attribute location not found for ", _format[i].type);
|
//Log.d("Attribute location not found for ", _format[i].type);
|
||||||
|
@ -1402,7 +1414,7 @@ class DummyVertexBuffer : VertexBuffer {
|
||||||
for(int i = 0; i < _format.length; i++) {
|
for(int i = 0; i < _format.length; i++) {
|
||||||
int loc = effect.getVertexElementLocation(_format[i].type);
|
int loc = effect.getVertexElementLocation(_format[i].type);
|
||||||
if (loc >= 0) {
|
if (loc >= 0) {
|
||||||
checkgl!glVertexAttribPointer(loc, _format[i].size, GL_FLOAT, GL_FALSE, _format.vertexSize, cast(char*)(offset));
|
checkgl!glVertexAttribPointer(loc, _format[i].size, GL_FLOAT, cast(ubyte)GL_FALSE, _format.vertexSize, cast(char*)(offset));
|
||||||
checkgl!glEnableVertexAttribArray(loc);
|
checkgl!glEnableVertexAttribArray(loc);
|
||||||
} else {
|
} else {
|
||||||
//Log.d("Attribute location not found for ", _format[i].type);
|
//Log.d("Attribute location not found for ", _format[i].type);
|
||||||
|
|
|
@ -222,6 +222,7 @@ extern (C) void initLogs() {
|
||||||
}
|
}
|
||||||
} else version(Android) {
|
} else version(Android) {
|
||||||
Log.setLogTag("dlangui");
|
Log.setLogTag("dlangui");
|
||||||
|
Log.setLogLevel(LogLevel.Trace);
|
||||||
} else {
|
} else {
|
||||||
Log.setStderrLogger();
|
Log.setStderrLogger();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue