From b7f9c7681aa9e20673c3b82ff789aee07b64c98b Mon Sep 17 00:00:00 2001 From: Jerome St-Louis Date: Sun, 15 Feb 2015 14:59:47 -0500 Subject: [PATCH] ecere/src/com; gfx; gui: Temporary patches for alignment issues - Fixes alignment issues with Emscripten - Had to make public double members changing the alignment of structs - Adjusting struct offset when derived class has a larger alignment than base class - Bootstrap updated --- compiler/bootstrap/ecere/bootstrap/Array.c | 4 +++- compiler/bootstrap/ecere/bootstrap/i18n.c | 2 +- compiler/bootstrap/ecere/bootstrap/instance.c | 33 +++++++++++++++++++++++++-- ecere/src/com/instance.ec | 12 ++++++++-- ecere/src/gfx/3D/Camera.ec | 2 +- ecere/src/gfx/3D/Object.ec | 3 ++- ecere/src/gfx/drivers/OpenGLDisplayDriver.ec | 12 +++++----- ecere/src/gui/Timer.ec | 2 +- ecere/src/gui/controls/ListBox.ec | 2 +- 9 files changed, 56 insertions(+), 16 deletions(-) diff --git a/compiler/bootstrap/ecere/bootstrap/Array.c b/compiler/bootstrap/ecere/bootstrap/Array.c index bac66a2..53bfcde 100644 --- a/compiler/bootstrap/ecere/bootstrap/Array.c +++ b/compiler/bootstrap/ecere/bootstrap/Array.c @@ -558,7 +558,9 @@ if(__ecerePointer___ecereNameSpace__ecere__com__Array->count != value) if(value > __ecerePointer___ecereNameSpace__ecere__com__Array->minAllocSize) __ecerePointer___ecereNameSpace__ecere__com__Array->array = __ecereNameSpace__ecere__com__eSystem_Renew0(__ecerePointer___ecereNameSpace__ecere__com__Array->array, ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[0].__anon1.__anon1.dataTypeClass->typeSize * (value)); else if(value > __ecerePointer___ecereNameSpace__ecere__com__Array->count) -memset(((unsigned char *)__ecerePointer___ecereNameSpace__ecere__com__Array->array) + (__ecerePointer___ecereNameSpace__ecere__com__Array->count * ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[0].__anon1.__anon1.dataTypeClass->typeSize), 0, (value - __ecerePointer___ecereNameSpace__ecere__com__Array->count) * ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[0].__anon1.__anon1.dataTypeClass->typeSize); +{ +memset((unsigned char *)__ecerePointer___ecereNameSpace__ecere__com__Array->array + __ecerePointer___ecereNameSpace__ecere__com__Array->count * ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[0].__anon1.__anon1.dataTypeClass->typeSize, 0, (value - __ecerePointer___ecereNameSpace__ecere__com__Array->count) * ((struct __ecereNameSpace__ecere__com__Instance *)(char *)this)->_class->templateArgs[0].__anon1.__anon1.dataTypeClass->typeSize); +} __ecerePointer___ecereNameSpace__ecere__com__Array->count = value; } __ecereNameSpace__ecere__com__eInstance_FireSelfWatchers(this, __ecereProp___ecereNameSpace__ecere__com__Array_size), __ecereNameSpace__ecere__com__eInstance_FireSelfWatchers(this, __ecerePropM___ecereNameSpace__ecere__com__Array_size); diff --git a/compiler/bootstrap/ecere/bootstrap/i18n.c b/compiler/bootstrap/ecere/bootstrap/i18n.c index 8051058..b83974d 100644 --- a/compiler/bootstrap/ecere/bootstrap/i18n.c +++ b/compiler/bootstrap/ecere/bootstrap/i18n.c @@ -546,7 +546,7 @@ sprintf(fileName, "/usr/share/locale/%s/LC_MESSAGES/%s.mo", genericLocale, name) f = __ecereNameSpace__ecere__sys__FileOpen(fileName, 1); } } -if(f) +if(0) { unsigned int magic = 0; diff --git a/compiler/bootstrap/ecere/bootstrap/instance.c b/compiler/bootstrap/ecere/bootstrap/instance.c index da09af0..abd54ba 100644 --- a/compiler/bootstrap/ecere/bootstrap/instance.c +++ b/compiler/bootstrap/ecere/bootstrap/instance.c @@ -582,6 +582,10 @@ byteDest[d] = 0; return d; } +void __ecereNameSpace__ecere__com__queryMemInfo(char * string) +{ +} + struct __ecereNameSpace__ecere__sys__OldList { void * first; @@ -2017,9 +2021,11 @@ if(alignment) { short __simpleStruct0; unsigned int pointerAlignment = alignment == 0xF000F000; +unsigned int force64Bits = 0; +unsigned int force32Bits = 0; if(pointerAlignment) -alignment = sizeof(void *); +alignment = force64Bits ? 8 : force32Bits ? 4 : sizeof(void *); if(pointerAlignment && member->structAlignment <= 4) member->pointerAlignment = 1; else if(!pointerAlignment && alignment >= 8) @@ -3238,12 +3244,14 @@ size = 16; } } if(pointerAlignment) -alignment = sizeof(void *); +alignment = force64Bits ? 8 : force32Bits ? 4 : sizeof(void *); if(pointerAlignment && _class->structAlignment <= 4) _class->pointerAlignment = 1; else if(!pointerAlignment && alignment >= 8) _class->pointerAlignment = 0; _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment); +if(_class->offset % alignment) +_class->offset += alignment - (_class->offset % alignment); if(_class->memberOffset % alignment) _class->memberOffset += alignment - (_class->memberOffset % alignment); } @@ -4004,6 +4012,7 @@ if(template->nameSpace) { struct __ecereNameSpace__ecere__com__BTNamedLink * link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*template->nameSpace).classes, template->name); +if(link) __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Delete(&(*template->nameSpace).classes, (struct __ecereNameSpace__ecere__sys__BTNode *)link); } __ecereNameSpace__ecere__com__FreeTemplateArgs(template); @@ -4733,7 +4742,11 @@ dataTypeString = enumBase ? enumBase->dataTypeString : base->dataTypeString; offsetClass = base ? (base->templateClass ? base->templateClass->sizeClass : base->sizeClass) : (type == 5 ? 0 : 0); totalSizeClass = offsetClass + sizeClass; if(type == 0 || type == 5) +{ _class->offset = (base && (base->templateClass ? (type == 0 ? base->templateClass->structSize : base->templateClass->memberOffset) : (type == 0 ? base->structSize : base->memberOffset)) && base->type != 1000) ? (base->templateClass ? base->templateClass->structSize : base->structSize) : ((type == 5) ? 0 : sizeof(struct __ecereNameSpace__ecere__com__Instance)); +if(_class->structAlignment && (_class->offset % _class->structAlignment)) +_class->offset += _class->structAlignment - _class->offset % _class->structAlignment; +} else _class->offset = 0; if(type == 1) @@ -5016,6 +5029,21 @@ struct __ecereNameSpace__ecere__sys__OldLink * deriv, * template; struct __ecereNameSpace__ecere__com__ClassProperty * classProp; struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param; +if(_class->templateClass) +{ +struct __ecereNameSpace__ecere__sys__OldLink * templateLink; + +for(templateLink = _class->templateClass->templatized.first; templateLink; templateLink = templateLink->next) +{ +if(templateLink->data == _class) +{ +__ecereMethod___ecereNameSpace__ecere__sys__OldList_Delete(&_class->templateClass->templatized, templateLink); +break; +} +} +__ecereNameSpace__ecere__com__FreeTemplate(_class); +return ; +} (__ecereNameSpace__ecere__com__eSystem_Delete(_class->_vTbl), _class->_vTbl = 0); __ecereNameSpace__ecere__com__FreeTemplates(_class); __ecereNameSpace__ecere__com__FreeTemplateArgs(_class); @@ -6828,5 +6856,6 @@ __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::sys::UTF8GetChar" __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::sys::UTF8toUTF16Buffer", "int ecere::sys::UTF8toUTF16Buffer(const char * source, uint16 * dest, int max)", __ecereNameSpace__ecere__sys__UTF8toUTF16Buffer, module, 4); __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::sys::UTF32toUTF8Len", "int ecere::sys::UTF32toUTF8Len(const unichar * source, int count, char * dest, int max)", __ecereNameSpace__ecere__sys__UTF32toUTF8Len, module, 4); __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::sys::UTF8toUTF16", "uint16 * ecere::sys::UTF8toUTF16(const char * source, int * wordCount)", __ecereNameSpace__ecere__sys__UTF8toUTF16, module, 4); +__ecereNameSpace__ecere__com__eSystem_RegisterFunction("ecere::com::queryMemInfo", "void ecere::com::queryMemInfo(char * string)", __ecereNameSpace__ecere__com__queryMemInfo, module, 4); } diff --git a/ecere/src/com/instance.ec b/ecere/src/com/instance.ec index 28aa627..df63f0f 100644 --- a/ecere/src/com/instance.ec +++ b/ecere/src/com/instance.ec @@ -2078,8 +2078,12 @@ static void FixDerivativesBase(Class base, Class mod) // _class.memberID = _class.startMemberID = (base && (type == normalClass || type == noHeadClass || type == structClass)) ? base.memberID : 0; if(type == normalClass || type == noHeadClass) + { // Use 'memberOffset' for nohead class as the members get added without padding _class.offset = (base && (base.templateClass ? (type == normalClass ? base.templateClass.structSize : base.templateClass.memberOffset) : (type == normalClass ? base.structSize : base.memberOffset)) && base.type != systemClass) ? (base.templateClass ? base.templateClass.structSize : base.structSize) : ((type == noHeadClass) ? 0 : sizeof(class Instance)); + if(_class.structAlignment && (_class.offset % _class.structAlignment)) + _class.offset += _class.structAlignment - _class.offset % _class.structAlignment; + } else _class.offset = 0; // Force set to 0 @@ -5241,7 +5245,7 @@ public dllexport DataMember eClass_AddDataMember(Class _class, const char * name } } - if(pointerAlignment) alignment = sizeof(void *); + if(pointerAlignment) alignment = force64Bits ? 8 : force32Bits ? 4 : sizeof(void *); if(pointerAlignment && _class.structAlignment <= 4) _class.pointerAlignment = 1; @@ -5250,6 +5254,8 @@ public dllexport DataMember eClass_AddDataMember(Class _class, const char * name _class.structAlignment = Max(_class.structAlignment, alignment); + if(_class.offset % alignment) + _class.offset += alignment - (_class.offset % alignment); if(_class.memberOffset % alignment) _class.memberOffset += alignment - (_class.memberOffset % alignment); } @@ -5283,7 +5289,9 @@ public dllexport DataMember eMember_AddDataMember(DataMember member, const char if(alignment) { bool pointerAlignment = alignment == 0xF000F000; - if(pointerAlignment) alignment = sizeof(void *); + bool force64Bits = false; //(member._class.module.application.isGUIApp & 2) ? true : false; + bool force32Bits = false; //(member._class.module.application.isGUIApp & 4) ? true : false; + if(pointerAlignment) alignment = force64Bits ? 8 : force32Bits ? 4 : sizeof(void *); if(pointerAlignment && member.structAlignment <= 4) member.pointerAlignment = 1; diff --git a/ecere/src/gfx/3D/Camera.ec b/ecere/src/gfx/3D/Camera.ec index a9357b8..1aba78c 100644 --- a/ecere/src/gfx/3D/Camera.ec +++ b/ecere/src/gfx/3D/Camera.ec @@ -598,7 +598,7 @@ private: FovDirection fovDirection; Object cameraObject; Object target; - Vector3D position; + public Vector3D position; Quaternion orientation; Euler eulerOrientation; float aspectRatio; diff --git a/ecere/src/gfx/3D/Object.ec b/ecere/src/gfx/3D/Object.ec index 56c5103..3ab47ae 100644 --- a/ecere/src/gfx/3D/Object.ec +++ b/ecere/src/gfx/3D/Object.ec @@ -1513,7 +1513,8 @@ private: unsigned startFrame, endFrame; int frame; Vector3Df pivot; - Transform transform; + + public Transform transform; Matrix matrix; Matrix localMatrix; void * tag; diff --git a/ecere/src/gfx/drivers/OpenGLDisplayDriver.ec b/ecere/src/gfx/drivers/OpenGLDisplayDriver.ec index 4c06cf0..fe7b6a6 100644 --- a/ecere/src/gfx/drivers/OpenGLDisplayDriver.ec +++ b/ecere/src/gfx/drivers/OpenGLDisplayDriver.ec @@ -109,9 +109,10 @@ namespace gfx::drivers; #if defined(__EMSCRIPTEN__) #define EM_MODE +// #define _GLES #endif -#define EM_MODE +//#define EM_MODE #undef pointer @@ -3625,7 +3626,6 @@ class OpenGLDisplayDriver : DisplayDriver position[1] = direction.y; position[2] = direction.z; - PrintLn("position"); glLightfv(GL_LIGHT0 + id, GL_POSITION, position); } } @@ -3706,10 +3706,10 @@ class OpenGLDisplayDriver : DisplayDriver // ... glEnable(GL_DEPTH_TEST); -#if !defined(EM_MODE) +//#if !defined(EM_MODE) glEnable(GL_LIGHTING); glShadeModel(GL_SMOOTH); -#endif +//#endif glDepthMask((byte)bool::true); oglDisplay.depthWrite = true; @@ -3725,9 +3725,9 @@ class OpenGLDisplayDriver : DisplayDriver glDisable(GL_LIGHTING); glDisable(GL_FOG); glDisable(GL_TEXTURE_2D); -#if !defined(EM_MODE) +//#if !defined(EM_MODE) glShadeModel(GL_FLAT); -#endif +//#endif glEnable(GL_BLEND); glDisable(GL_MULTISAMPLE_ARB); diff --git a/ecere/src/gui/Timer.ec b/ecere/src/gui/Timer.ec index 6ddf5d3..f71264f 100644 --- a/ecere/src/gui/Timer.ec +++ b/ecere/src/gui/Timer.ec @@ -38,7 +38,7 @@ public: private: Timer prev, next; - Seconds delay; + public Seconds delay; Time lastTime; Window window; bool dispatched; diff --git a/ecere/src/gui/controls/ListBox.ec b/ecere/src/gui/controls/ListBox.ec index d9ce74a..ba0a39c 100644 --- a/ecere/src/gui/controls/ListBox.ec +++ b/ecere/src/gui/controls/ListBox.ec @@ -4508,7 +4508,7 @@ private: int rowCount; int rowHeight; int fontH; - double typingTimeOut; + public double typingTimeOut; char * typedString; int mouseX, mouseY; -- 1.8.3.1