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 void onSurfaceCreated(GL10 gl, EGLConfig config) {
interfaceJNI.RenderInit();
}

View File

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

View File

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

View File

@ -186,6 +186,36 @@ namespace etk {
tmpp *= obj;
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 {
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_LDLIBS := -lGLESv2 -ldl -llog
#LOCAL_EXPORT_LDLIBS := -lGLESv1_CM -ldl -llog
LOCAL_CFLAGS := -Wno-write-strings \
-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)
# Ewol Test Software :
LOCAL_LDLIBS := -lGLESv2 -ldl -llog -lz
include $(BUILD_STATIC_LIBRARY)

View File

@ -120,6 +120,11 @@ ewol::TexturedFont::TexturedFont(etk::UString fontName) :
}
int32_t nbLine = (nbElement / nbRaws) + 1;
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 << ")");
// resize must be done on the texture ...
SetImageSize(Vector2D<int32_t>(textureWidth,textureHeight));

View File

@ -29,12 +29,15 @@
#include <ewol/openGL/Program.h>
#include <ewol/ResourceManager.h>
//#define LOCAL_DEBUG EWOL_VERBOSE
#define LOCAL_DEBUG EWOL_DEBUG
ewol::Program::Program(etk::UString& filename) :
ewol::Resource(filename),
m_program(0),
m_hasTexture(false)
{
EWOL_DEBUG("OGL : load PROGRAM \"" << filename << "\"");
// load data from file "all the time ..."
etk::File file(m_name, etk::FILE_TYPE_DATA);
@ -55,6 +58,7 @@ ewol::Program::Program(etk::UString& filename) :
#define MAX_LINE_SIZE (2048)
char tmpData[MAX_LINE_SIZE];
while (file.fGets(tmpData, MAX_LINE_SIZE) != NULL) {
EWOL_DEBUG(" Read data : \"" << tmpData << "\"");
int32_t len = strlen(tmpData);
if( tmpData[len-1] == '\n'
|| tmpData[len-1] == '\r') {
@ -96,10 +100,10 @@ ewol::Program::~Program(void)
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()) {
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++) {
if (NULL != m_shaderList[iii]) {
glAttachShader(m_program, m_shaderList[iii]->GetGL_ID());
checkGlError("glAttachShader");
checkGlError("glAttachShader", __LINE__);
}
}
glLinkProgram(m_program);
checkGlError("glLinkProgram", __LINE__);
GLint linkStatus = GL_FALSE;
glGetProgramiv(m_program, GL_LINK_STATUS, &linkStatus);
checkGlError("glGetProgramiv", __LINE__);
if (linkStatus != GL_TRUE) {
GLint bufLength = 0;
l_bufferDisplayError[0] = '\0';
glGetProgramInfoLog(m_program, LOG_OGL_INTERNAL_BUFFER_LEN, &bufLength, l_bufferDisplayError);
EWOL_ERROR("Could not compile \"PROGRAM\": " << l_bufferDisplayError);
glDeleteProgram(m_program);
checkGlError("glDeleteProgram", __LINE__);
m_program = 0;
return false;
}
@ -149,7 +156,7 @@ int32_t ewol::Program::GetAttribute(etk::UString tmpElement)
tmp.m_isAttribute = true;
tmp.m_elementId = glGetAttribLocation(m_program, tmp.m_name.c_str());
if (tmp.m_elementId<0) {
checkGlError("glGetAttribLocation");
checkGlError("glGetAttribLocation", __LINE__);
EWOL_INFO("glGetAttribLocation(\"" << tmp.m_name << "\") = " << tmp.m_elementId);
return -1;
}
@ -170,7 +177,7 @@ int32_t ewol::Program::GetUniform(etk::UString tmpElement)
tmp.m_isAttribute = false;
tmp.m_elementId = glGetUniformLocation(m_program, tmp.m_name.c_str());
if (tmp.m_elementId<0) {
checkGlError("glGetUniformLocation");
checkGlError("glGetUniformLocation", __LINE__);
EWOL_INFO("glGetUniformLocation(\"" << tmp.m_name << "\") = " << tmp.m_elementId);
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
jumpBetweenSample, // no extra data between each position
pointer); // Pointer on the buffer
checkGlError("glVertexAttribPointer", __LINE__);
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()) {
EWOL_ERROR("idElem = " << idElem << " not in [0.." << (m_elementList.Size()-1) << "]");
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)
{
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()) {
return;
}
glEnable(GL_TEXTURE_2D);
#if 0
glEnable(GL_TEXTURE_2D);
checkGlError("glEnable", __LINE__);
#endif
glActiveTexture(GL_TEXTURE0);
checkGlError("glActiveTexture", __LINE__);
// set the textureID
glBindTexture(GL_TEXTURE_2D, textureOpenGlID);
checkGlError("glBindTexture", __LINE__);
// Set the texture on the uniform attribute
glUniform1i(m_elementList[idElem].m_elementId, /*GL_TEXTURE*/0);
checkGlError("glUniform1i", __LINE__);
m_hasTexture = true;
}
void ewol::Program::UnUse(void)
{
#if 0
if (true == m_hasTexture) {
glDisable(GL_TEXTURE_2D);
checkGlError("glDisable", __LINE__);
m_hasTexture = false;
}
#endif
glUseProgram(0);
checkGlError("glUseProgram");
checkGlError("glUseProgram", __LINE__);
}

View File

@ -56,7 +56,7 @@
int32_t GetAttribute(etk::UString tmpElement);
void SendAttribute(int32_t idElem, int32_t nbElement, void* pointer, int32_t jumpBetweenSample=0);
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 SetTexture0(int32_t idElem, GLint textureOpenGlID);
void UnUse(void);

View File

@ -37,6 +37,7 @@ ewol::Shader::Shader(etk::UString& filename):
m_shader(0),
m_type(0)
{
EWOL_DEBUG("OGL : load SHADER \"" << filename << "\"");
// load data from file "all the time ..."
etk::File file(m_name, etk::FILE_TYPE_DATA);
@ -109,20 +110,32 @@ bool ewol::Shader::CompileAndSendShader(void)
m_shader = 0;
return false;
}
EWOL_DEBUG(" --> Create");
m_shader = glCreateShader(m_type);
EWOL_DEBUG(" <-- Create");
if (!m_shader) {
EWOL_ERROR("glCreateShader return error ...");
EWOL_DEBUG(" --> checkGlError");
checkGlError("glCreateShader");
EWOL_DEBUG(" <-- checkGlError");
return false;
} else {
EWOL_DEBUG(" --> glShaderSource");
glShaderSource(m_shader, 1, (const char**)&m_fileData, NULL);
EWOL_DEBUG(" <-- glShaderSource");
EWOL_DEBUG(" --> glCompileShader");
glCompileShader(m_shader);
EWOL_DEBUG(" <-- glCompileShader");
GLint compiled = 0;
EWOL_DEBUG(" --> glGetShaderiv");
glGetShaderiv(m_shader, GL_COMPILE_STATUS, &compiled);
EWOL_DEBUG(" <-- glGetShaderiv");
if (!compiled) {
GLint infoLen = 0;
l_bufferDisplayError[0] = '\0';
EWOL_DEBUG(" --> glGetShaderInfoLog");
glGetShaderInfoLog(m_shader, LOG_OGL_INTERNAL_BUFFER_LEN, &infoLen, l_bufferDisplayError);
EWOL_DEBUG(" <-- glGetShaderInfoLog");
const char * tmpShaderType = "GL_FRAGMENT_SHADER";
if (m_type == 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;
enum {
THREAD_INIT,
THREAD_RECALCULATE_SIZE,
THREAD_RESIZE,
THREAD_HIDE,
@ -104,6 +105,10 @@ void ewolProcessEvents(void)
l_msgSystem.Wait(data);
//EWOL_DEBUG("EVENT");
switch (data.TypeMessage) {
case THREAD_INIT:
// this is due to the openGL context
APP_Init();
break;
case THREAD_RECALCULATE_SIZE:
eSystem::ForceRedrawAll();
break;
@ -226,11 +231,18 @@ void eSystem::SetArchiveDir(int mode, const char* str)
bool isGlobalSystemInit = false;
void RequestInit(void)
{
if (true == isGlobalSystemInit) {
eSystemMessage_ts data;
data.TypeMessage = THREAD_INIT;
l_msgSystem.Post(data);
}
}
void eSystem::Init(void)
{
EWOL_INFO("==> Ewol System Init (BEGIN)");
@ -248,8 +260,9 @@ void eSystem::Init(void)
ewol::widgetManager::Init();
ewol::font::Init();
ewol::shortCut::Init();
APP_Init();
isGlobalSystemInit = true;
// request the init of the application in the main context of openGL ...
RequestInit();
// force a recalculation
ewol::RequestUpdateSize();
}
@ -279,6 +292,7 @@ void eSystem::UnInit(void)
EWOL_INFO("==> Ewol System Un-Init (END)");
}
void ewol::RequestUpdateSize(void)
{
if (true == isGlobalSystemInit) {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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