Android OpenGl-ES2 work corectly ==> many check is done ==> we can do it only one time by cycle

This commit is contained in:
Edouard DUPIN 2012-08-30 13:38:39 +02:00
parent 085b7cb9cd
commit cc6d40f9d6
17 changed files with 147 additions and 21 deletions

2
Build

@ -1 +1 @@
Subproject commit b4c2998dc8054173f0dd055ecd66411b96eaf8cd Subproject commit c756ceacf5a758f882263bb5f0fbd755373f00b6

View File

@ -41,6 +41,7 @@ import org.ewol.interfaceJNI;
public class interfaceOpenGL implements GLSurfaceView.Renderer { public class interfaceOpenGL implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 gl, EGLConfig config) { public void onSurfaceCreated(GL10 gl, EGLConfig config) {
interfaceJNI.RenderInit(); interfaceJNI.RenderInit();
} }

View File

@ -47,6 +47,9 @@ public class interfaceSurfaceView extends GLSurfaceView {
// super must be first statement in constructor // super must be first statement in constructor
super(context); super(context);
// Create an OpenGL ES 2.0 context
setEGLContextClientVersion(2);
// je n'ai pas compris ... // je n'ai pas compris ...
m_ewolDrawer = new interfaceOpenGL(); m_ewolDrawer = new interfaceOpenGL();
setRenderer(m_ewolDrawer); setRenderer(m_ewolDrawer);

View File

@ -724,6 +724,7 @@ char * etk::File::fGets(char * elementLine, int32_t maxData)
memset(elementLine, 0, maxData); memset(elementLine, 0, maxData);
#ifdef __TARGET_OS__Android #ifdef __TARGET_OS__Android
char * element = elementLine; char * element = elementLine;
int32_t outSize = 0;
if (etk::FILE_TYPE_DATA == m_type) {//char * tmpData = internalDataFiles[iii].data + m_readingOffset; if (etk::FILE_TYPE_DATA == m_type) {//char * tmpData = internalDataFiles[iii].data + m_readingOffset;
if (NULL == m_zipData) { if (NULL == m_zipData) {
element[0] = '\0'; element[0] = '\0';
@ -750,8 +751,19 @@ char * etk::File::fGets(char * elementLine, int32_t maxData)
*element = '\0'; *element = '\0';
return elementLine; return elementLine;
} }
// check maxData Size ...
if (outSize>=maxData-1) {
*element = '\0';
return elementLine;
} }
outSize++;
}
if (outSize==0) {
return NULL; return NULL;
} else {
// send last line
return elementLine;
}
} }
#endif #endif
return fgets(elementLine, maxData, m_PointerFile); return fgets(elementLine, maxData, m_PointerFile);

View File

@ -186,6 +186,36 @@ namespace etk {
tmpp *= obj; tmpp *= obj;
return tmpp; return tmpp;
} }
/*****************************************************
* other basic function :
*****************************************************/
void Transpose(void)
{
float tmpVal = m_mat[1];
m_mat[1] = m_mat[4];
m_mat[4] = tmpVal;
tmpVal = m_mat[2];
m_mat[2] = m_mat[8];
m_mat[8] = tmpVal;
tmpVal = m_mat[6];
m_mat[6] = m_mat[9];
m_mat[9] = tmpVal;
tmpVal = m_mat[3];
m_mat[3] = m_mat[12];
m_mat[12] = tmpVal;
tmpVal = m_mat[7];
m_mat[7] = m_mat[13];
m_mat[13] = tmpVal;
tmpVal = m_mat[11];
m_mat[11] = m_mat[14];
m_mat[14] = tmpVal;
}
}; };
namespace matrix { namespace matrix {
Matrix Perspective(float left, float right, float bottom, float top, float nearVal, float farVal); Matrix Perspective(float left, float right, float bottom, float top, float nearVal, float farVal);

View File

@ -18,6 +18,7 @@ LOCAL_C_INCLUDES :=
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
LOCAL_EXPORT_LDLIBS := -lGLESv2 -ldl -llog LOCAL_EXPORT_LDLIBS := -lGLESv2 -ldl -llog
#LOCAL_EXPORT_LDLIBS := -lGLESv1_CM -ldl -llog
LOCAL_CFLAGS := -Wno-write-strings \ LOCAL_CFLAGS := -Wno-write-strings \
-DEWOL_VERSION_TAG_NAME="\"$(LOCAL_VERSION_TAG_SHORT)-$(BUILD_DIRECTORY_MODE)\"" \ -DEWOL_VERSION_TAG_NAME="\"$(LOCAL_VERSION_TAG_SHORT)-$(BUILD_DIRECTORY_MODE)\"" \
@ -32,9 +33,6 @@ include $(LOCAL_PATH)/file.mk
LOCAL_SRC_FILES := ewol/os/gui.Android.cpp $(FILE_LIST) LOCAL_SRC_FILES := ewol/os/gui.Android.cpp $(FILE_LIST)
# Ewol Test Software :
LOCAL_LDLIBS := -lGLESv2 -ldl -llog -lz
include $(BUILD_STATIC_LIBRARY) include $(BUILD_STATIC_LIBRARY)

View File

@ -120,6 +120,11 @@ ewol::TexturedFont::TexturedFont(etk::UString fontName) :
} }
int32_t nbLine = (nbElement / nbRaws) + 1; int32_t nbLine = (nbElement / nbRaws) + 1;
int32_t textureHeight = nextP2(nbLine*glyphMaxHeight); int32_t textureHeight = nextP2(nbLine*glyphMaxHeight);
// for android :
textureHeight = etk_max(textureHeight, textureWidth);
textureWidth = textureHeight;
EWOL_DEBUG("Generate a text texture for char(" << nbRaws << "," << nbLine << ") with size=(" << textureWidth << "," << textureHeight << ")"); EWOL_DEBUG("Generate a text texture for char(" << nbRaws << "," << nbLine << ") with size=(" << textureWidth << "," << textureHeight << ")");
// resize must be done on the texture ... // resize must be done on the texture ...
SetImageSize(Vector2D<int32_t>(textureWidth,textureHeight)); SetImageSize(Vector2D<int32_t>(textureWidth,textureHeight));

View File

@ -29,12 +29,15 @@
#include <ewol/openGL/Program.h> #include <ewol/openGL/Program.h>
#include <ewol/ResourceManager.h> #include <ewol/ResourceManager.h>
//#define LOCAL_DEBUG EWOL_VERBOSE
#define LOCAL_DEBUG EWOL_DEBUG
ewol::Program::Program(etk::UString& filename) : ewol::Program::Program(etk::UString& filename) :
ewol::Resource(filename), ewol::Resource(filename),
m_program(0), m_program(0),
m_hasTexture(false) m_hasTexture(false)
{ {
EWOL_DEBUG("OGL : load PROGRAM \"" << filename << "\"");
// load data from file "all the time ..." // load data from file "all the time ..."
etk::File file(m_name, etk::FILE_TYPE_DATA); etk::File file(m_name, etk::FILE_TYPE_DATA);
@ -55,6 +58,7 @@ ewol::Program::Program(etk::UString& filename) :
#define MAX_LINE_SIZE (2048) #define MAX_LINE_SIZE (2048)
char tmpData[MAX_LINE_SIZE]; char tmpData[MAX_LINE_SIZE];
while (file.fGets(tmpData, MAX_LINE_SIZE) != NULL) { while (file.fGets(tmpData, MAX_LINE_SIZE) != NULL) {
EWOL_DEBUG(" Read data : \"" << tmpData << "\"");
int32_t len = strlen(tmpData); int32_t len = strlen(tmpData);
if( tmpData[len-1] == '\n' if( tmpData[len-1] == '\n'
|| tmpData[len-1] == '\r') { || tmpData[len-1] == '\r') {
@ -96,10 +100,10 @@ ewol::Program::~Program(void)
m_hasTexture = false; m_hasTexture = false;
} }
static void checkGlError(const char* op) static void checkGlError(const char* op, int32_t localLine)
{ {
for (GLint error = glGetError(); error; error = glGetError()) { for (GLint error = glGetError(); error; error = glGetError()) {
EWOL_INFO("after " << op << "() glError (" << error << ")"); EWOL_INFO("after " << op << "():" << localLine << " glError(" << error << ")");
} }
} }
@ -118,18 +122,21 @@ bool ewol::Program::CreateAndLink(void)
for (int32_t iii=0; iii<m_shaderList.Size(); iii++) { for (int32_t iii=0; iii<m_shaderList.Size(); iii++) {
if (NULL != m_shaderList[iii]) { if (NULL != m_shaderList[iii]) {
glAttachShader(m_program, m_shaderList[iii]->GetGL_ID()); glAttachShader(m_program, m_shaderList[iii]->GetGL_ID());
checkGlError("glAttachShader"); checkGlError("glAttachShader", __LINE__);
} }
} }
glLinkProgram(m_program); glLinkProgram(m_program);
checkGlError("glLinkProgram", __LINE__);
GLint linkStatus = GL_FALSE; GLint linkStatus = GL_FALSE;
glGetProgramiv(m_program, GL_LINK_STATUS, &linkStatus); glGetProgramiv(m_program, GL_LINK_STATUS, &linkStatus);
checkGlError("glGetProgramiv", __LINE__);
if (linkStatus != GL_TRUE) { if (linkStatus != GL_TRUE) {
GLint bufLength = 0; GLint bufLength = 0;
l_bufferDisplayError[0] = '\0'; l_bufferDisplayError[0] = '\0';
glGetProgramInfoLog(m_program, LOG_OGL_INTERNAL_BUFFER_LEN, &bufLength, l_bufferDisplayError); glGetProgramInfoLog(m_program, LOG_OGL_INTERNAL_BUFFER_LEN, &bufLength, l_bufferDisplayError);
EWOL_ERROR("Could not compile \"PROGRAM\": " << l_bufferDisplayError); EWOL_ERROR("Could not compile \"PROGRAM\": " << l_bufferDisplayError);
glDeleteProgram(m_program); glDeleteProgram(m_program);
checkGlError("glDeleteProgram", __LINE__);
m_program = 0; m_program = 0;
return false; return false;
} }
@ -149,7 +156,7 @@ int32_t ewol::Program::GetAttribute(etk::UString tmpElement)
tmp.m_isAttribute = true; tmp.m_isAttribute = true;
tmp.m_elementId = glGetAttribLocation(m_program, tmp.m_name.c_str()); tmp.m_elementId = glGetAttribLocation(m_program, tmp.m_name.c_str());
if (tmp.m_elementId<0) { if (tmp.m_elementId<0) {
checkGlError("glGetAttribLocation"); checkGlError("glGetAttribLocation", __LINE__);
EWOL_INFO("glGetAttribLocation(\"" << tmp.m_name << "\") = " << tmp.m_elementId); EWOL_INFO("glGetAttribLocation(\"" << tmp.m_name << "\") = " << tmp.m_elementId);
return -1; return -1;
} }
@ -170,7 +177,7 @@ int32_t ewol::Program::GetUniform(etk::UString tmpElement)
tmp.m_isAttribute = false; tmp.m_isAttribute = false;
tmp.m_elementId = glGetUniformLocation(m_program, tmp.m_name.c_str()); tmp.m_elementId = glGetUniformLocation(m_program, tmp.m_name.c_str());
if (tmp.m_elementId<0) { if (tmp.m_elementId<0) {
checkGlError("glGetUniformLocation"); checkGlError("glGetUniformLocation", __LINE__);
EWOL_INFO("glGetUniformLocation(\"" << tmp.m_name << "\") = " << tmp.m_elementId); EWOL_INFO("glGetUniformLocation(\"" << tmp.m_name << "\") = " << tmp.m_elementId);
return -1; return -1;
} }
@ -190,24 +197,29 @@ void ewol::Program::SendAttribute(int32_t idElem, int32_t nbElement, void* point
GL_FALSE, // take our values as-is GL_FALSE, // take our values as-is
jumpBetweenSample, // no extra data between each position jumpBetweenSample, // no extra data between each position
pointer); // Pointer on the buffer pointer); // Pointer on the buffer
checkGlError("glVertexAttribPointer", __LINE__);
glEnableVertexAttribArray(m_elementList[idElem].m_elementId); glEnableVertexAttribArray(m_elementList[idElem].m_elementId);
checkGlError("glEnableVertexAttribArray", __LINE__);
} }
void ewol::Program::SendUniformMatrix4fv(int32_t idElem, int32_t nbElement, float* pointer) void ewol::Program::SendUniformMatrix4fv(int32_t idElem, int32_t nbElement, etk::Matrix _matrix)
{ {
if (idElem<0 || idElem>m_elementList.Size()) { if (idElem<0 || idElem>m_elementList.Size()) {
EWOL_ERROR("idElem = " << idElem << " not in [0.." << (m_elementList.Size()-1) << "]"); EWOL_ERROR("idElem = " << idElem << " not in [0.." << (m_elementList.Size()-1) << "]");
return; return;
} }
glUniformMatrix4fv(m_elementList[idElem].m_elementId, nbElement, GL_TRUE, pointer); // note : Android des not supported the transposition of the matrix, then we will done it oursef:
_matrix.Transpose();
glUniformMatrix4fv(m_elementList[idElem].m_elementId, nbElement, GL_FALSE, _matrix.m_mat);
checkGlError("glUniformMatrix4fv", __LINE__);
} }
void ewol::Program::Use(void) void ewol::Program::Use(void)
{ {
glUseProgram(m_program); glUseProgram(m_program);
checkGlError("glUseProgram"); checkGlError("glUseProgram", __LINE__);
} }
@ -216,23 +228,32 @@ void ewol::Program::SetTexture0(int32_t idElem, GLint textureOpenGlID)
if (idElem<0 || idElem>m_elementList.Size()) { if (idElem<0 || idElem>m_elementList.Size()) {
return; return;
} }
#if 0
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
checkGlError("glEnable", __LINE__);
#endif
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
checkGlError("glActiveTexture", __LINE__);
// set the textureID // set the textureID
glBindTexture(GL_TEXTURE_2D, textureOpenGlID); glBindTexture(GL_TEXTURE_2D, textureOpenGlID);
checkGlError("glBindTexture", __LINE__);
// Set the texture on the uniform attribute // Set the texture on the uniform attribute
glUniform1i(m_elementList[idElem].m_elementId, /*GL_TEXTURE*/0); glUniform1i(m_elementList[idElem].m_elementId, /*GL_TEXTURE*/0);
checkGlError("glUniform1i", __LINE__);
m_hasTexture = true; m_hasTexture = true;
} }
void ewol::Program::UnUse(void) void ewol::Program::UnUse(void)
{ {
#if 0
if (true == m_hasTexture) { if (true == m_hasTexture) {
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
checkGlError("glDisable", __LINE__);
m_hasTexture = false; m_hasTexture = false;
} }
#endif
glUseProgram(0); glUseProgram(0);
checkGlError("glUseProgram"); checkGlError("glUseProgram", __LINE__);
} }

View File

@ -56,7 +56,7 @@
int32_t GetAttribute(etk::UString tmpElement); int32_t GetAttribute(etk::UString tmpElement);
void SendAttribute(int32_t idElem, int32_t nbElement, void* pointer, int32_t jumpBetweenSample=0); void SendAttribute(int32_t idElem, int32_t nbElement, void* pointer, int32_t jumpBetweenSample=0);
int32_t GetUniform(etk::UString tmpElement); int32_t GetUniform(etk::UString tmpElement);
void SendUniformMatrix4fv(int32_t idElem, int32_t nbElement, float* pointer); void SendUniformMatrix4fv(int32_t idElem, int32_t nbElement, etk::Matrix pointer);
void Use(void); void Use(void);
void SetTexture0(int32_t idElem, GLint textureOpenGlID); void SetTexture0(int32_t idElem, GLint textureOpenGlID);
void UnUse(void); void UnUse(void);

View File

@ -37,6 +37,7 @@ ewol::Shader::Shader(etk::UString& filename):
m_shader(0), m_shader(0),
m_type(0) m_type(0)
{ {
EWOL_DEBUG("OGL : load SHADER \"" << filename << "\"");
// load data from file "all the time ..." // load data from file "all the time ..."
etk::File file(m_name, etk::FILE_TYPE_DATA); etk::File file(m_name, etk::FILE_TYPE_DATA);
@ -109,20 +110,32 @@ bool ewol::Shader::CompileAndSendShader(void)
m_shader = 0; m_shader = 0;
return false; return false;
} }
EWOL_DEBUG(" --> Create");
m_shader = glCreateShader(m_type); m_shader = glCreateShader(m_type);
EWOL_DEBUG(" <-- Create");
if (!m_shader) { if (!m_shader) {
EWOL_ERROR("glCreateShader return error ..."); EWOL_ERROR("glCreateShader return error ...");
EWOL_DEBUG(" --> checkGlError");
checkGlError("glCreateShader"); checkGlError("glCreateShader");
EWOL_DEBUG(" <-- checkGlError");
return false; return false;
} else { } else {
EWOL_DEBUG(" --> glShaderSource");
glShaderSource(m_shader, 1, (const char**)&m_fileData, NULL); glShaderSource(m_shader, 1, (const char**)&m_fileData, NULL);
EWOL_DEBUG(" <-- glShaderSource");
EWOL_DEBUG(" --> glCompileShader");
glCompileShader(m_shader); glCompileShader(m_shader);
EWOL_DEBUG(" <-- glCompileShader");
GLint compiled = 0; GLint compiled = 0;
EWOL_DEBUG(" --> glGetShaderiv");
glGetShaderiv(m_shader, GL_COMPILE_STATUS, &compiled); glGetShaderiv(m_shader, GL_COMPILE_STATUS, &compiled);
EWOL_DEBUG(" <-- glGetShaderiv");
if (!compiled) { if (!compiled) {
GLint infoLen = 0; GLint infoLen = 0;
l_bufferDisplayError[0] = '\0'; l_bufferDisplayError[0] = '\0';
EWOL_DEBUG(" --> glGetShaderInfoLog");
glGetShaderInfoLog(m_shader, LOG_OGL_INTERNAL_BUFFER_LEN, &infoLen, l_bufferDisplayError); glGetShaderInfoLog(m_shader, LOG_OGL_INTERNAL_BUFFER_LEN, &infoLen, l_bufferDisplayError);
EWOL_DEBUG(" <-- glGetShaderInfoLog");
const char * tmpShaderType = "GL_FRAGMENT_SHADER"; const char * tmpShaderType = "GL_FRAGMENT_SHADER";
if (m_type == GL_VERTEX_SHADER){ if (m_type == GL_VERTEX_SHADER){
tmpShaderType = "GL_VERTEX_SHADER"; tmpShaderType = "GL_VERTEX_SHADER";

View File

@ -45,6 +45,7 @@ static Vector2D<int32_t> windowsSize(320, 480);
static ewol::eSystemInput l_managementInput; static ewol::eSystemInput l_managementInput;
enum { enum {
THREAD_INIT,
THREAD_RECALCULATE_SIZE, THREAD_RECALCULATE_SIZE,
THREAD_RESIZE, THREAD_RESIZE,
THREAD_HIDE, THREAD_HIDE,
@ -104,6 +105,10 @@ void ewolProcessEvents(void)
l_msgSystem.Wait(data); l_msgSystem.Wait(data);
//EWOL_DEBUG("EVENT"); //EWOL_DEBUG("EVENT");
switch (data.TypeMessage) { switch (data.TypeMessage) {
case THREAD_INIT:
// this is due to the openGL context
APP_Init();
break;
case THREAD_RECALCULATE_SIZE: case THREAD_RECALCULATE_SIZE:
eSystem::ForceRedrawAll(); eSystem::ForceRedrawAll();
break; break;
@ -226,11 +231,18 @@ void eSystem::SetArchiveDir(int mode, const char* str)
bool isGlobalSystemInit = false; bool isGlobalSystemInit = false;
void RequestInit(void)
{
if (true == isGlobalSystemInit) {
eSystemMessage_ts data;
data.TypeMessage = THREAD_INIT;
l_msgSystem.Post(data);
}
}
void eSystem::Init(void) void eSystem::Init(void)
{ {
EWOL_INFO("==> Ewol System Init (BEGIN)"); EWOL_INFO("==> Ewol System Init (BEGIN)");
@ -248,8 +260,9 @@ void eSystem::Init(void)
ewol::widgetManager::Init(); ewol::widgetManager::Init();
ewol::font::Init(); ewol::font::Init();
ewol::shortCut::Init(); ewol::shortCut::Init();
APP_Init();
isGlobalSystemInit = true; isGlobalSystemInit = true;
// request the init of the application in the main context of openGL ...
RequestInit();
// force a recalculation // force a recalculation
ewol::RequestUpdateSize(); ewol::RequestUpdateSize();
} }
@ -279,6 +292,7 @@ void eSystem::UnInit(void)
EWOL_INFO("==> Ewol System Un-Init (END)"); EWOL_INFO("==> Ewol System Un-Init (END)");
} }
void ewol::RequestUpdateSize(void) void ewol::RequestUpdateSize(void)
{ {
if (true == isGlobalSystemInit) { if (true == isGlobalSystemInit) {

View File

@ -1,3 +1,8 @@
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
varying vec4 f_color; varying vec4 f_color;
void main(void) { void main(void) {

View File

@ -1,3 +1,8 @@
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
// Input : // Input :
attribute vec2 EW_coord2d; attribute vec2 EW_coord2d;
attribute vec4 EW_color; attribute vec4 EW_color;

View File

@ -1,3 +1,8 @@
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
// Input : // Input :
uniform sampler2D EW_texID; uniform sampler2D EW_texID;

View File

@ -1,3 +1,8 @@
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
// Input : // Input :
attribute vec2 EW_coord2d; attribute vec2 EW_coord2d;
attribute vec2 EW_texture2d; attribute vec2 EW_texture2d;

View File

@ -1,3 +1,8 @@
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
// Input : // Input :
uniform sampler2D EW_texID; uniform sampler2D EW_texID;

View File

@ -1,3 +1,7 @@
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
// Input : // Input :
attribute vec2 EW_coord3d; attribute vec2 EW_coord3d;
attribute vec2 EW_texture2d; attribute vec2 EW_texture2d;