1
0

!!Thread drawing graphic IS MAIN THREAD!!

This commit is contained in:
otya128
2016-12-12 22:27:23 +09:00
parent a2908fc2f3
commit e51b8fa282
2 changed files with 116 additions and 148 deletions

View File

@@ -425,7 +425,14 @@ class Graphic
glTexCoord2f(tx2, ty1); glTexCoord2f(tx2, ty1);
glVertex3i(x + 8, y + 8, 0); glVertex3i(x + 8, y + 8, 0);
} }
void draw() void initVM()
{
SDL_GL_MakeCurrent(petitcom.window, petitcom.contextVM);
glAlphaFunc(GL_GEQUAL, 0.1f);
glEnable(GL_ALPHA_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
void draw2()
{ {
if (!GRP[0].glTexture) if (!GRP[0].glTexture)
{ {
@@ -439,14 +446,9 @@ class Graphic
} }
initGLGraphicPages(); initGLGraphicPages();
} }
if(!drawMessageLength) return;
drawflag = true;
//betuni kouzoutai demo sonnnani sokudo kawaranasasou //betuni kouzoutai demo sonnnani sokudo kawaranasasou
auto len = drawMessageLength; auto len = drawMessageLength;
int s = petitcom.renderstartpos;
GLint old; GLint old;
auto a = &glBindFramebuffer;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &old);
int oldpage = drawMessageQueue[0].page; int oldpage = drawMessageQueue[0].page;
glBindFramebufferEXT(GL_FRAMEBUFFER, this.GRP[oldpage].buffer); glBindFramebufferEXT(GL_FRAMEBUFFER, this.GRP[oldpage].buffer);
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
@@ -461,25 +463,11 @@ class Graphic
glLoadIdentity(); glLoadIdentity();
glOrtho(x, x + w - 1, y, y + h - 1, -256, 1024);//wakaranai glOrtho(x, x + w - 1, y, y + h - 1, -256, 1024);//wakaranai
} }
chScreen(0, 0, 511, 511);
DrawType dt; DrawType dt;
auto start = SDL_GetTicks();
int i = s;
static const size = 255.5f; static const size = 255.5f;
int display = -1; DrawMessage dm = drawMessageQueue[0];
for(; i < len; i++) int display = dm.display;
{
DrawMessage dm = drawMessageQueue[i];
if(oldpage != dm.page)
{
oldpage = dm.page;
glBindFramebufferEXT(GL_FRAMEBUFFER, this.GRP[oldpage].buffer);
}
if (display != dm.display)
{
display = dm.display;
chScreen(writeArea[display].x, writeArea[display].y, writeArea[display].w, writeArea[display].h); chScreen(writeArea[display].x, writeArea[display].y, writeArea[display].w, writeArea[display].h);
}
switch(dm.type) switch(dm.type)
{ {
case DrawType.CLIPWRITE: case DrawType.CLIPWRITE:
@@ -487,7 +475,6 @@ class Graphic
writeArea[display].y = dm.y; writeArea[display].y = dm.y;
writeArea[display].w = dm.w; writeArea[display].w = dm.w;
writeArea[display].h = dm.h; writeArea[display].h = dm.h;
chScreen(writeArea[display].x, writeArea[display].y, writeArea[display].w, writeArea[display].h);
break; break;
case DrawType.PSET: case DrawType.PSET:
glBegin(GL_POINTS); glBegin(GL_POINTS);
@@ -572,51 +559,26 @@ class Graphic
break; break;
default: default:
} }
if(SDL_GetTicks() - start >= 16 && i != len - 1)
{
s = i + 1;
goto brk;
} }
dt = dm.type; DrawMessage[] drawMessageQueue = new DrawMessage[1];
}
brk:
if(i == len)
{
petitcom.renderstartpos = 0;
drawMessageLength = 0;
}
else
{
petitcom.renderstartpos = s;
}
glBindFramebufferEXT(GL_FRAMEBUFFER, old);
glEnable(GL_DEPTH_TEST);
drawflag = false;
glEnable(GL_ALPHA_TEST);
}
static const int dmqqueuelen = 8192;
DrawMessage[] drawMessageQueue = new DrawMessage[dmqqueuelen];
int drawMessageLength; int drawMessageLength;
bool drawflag; bool drawflag;
bool flushRequired;
void updateVM()
{
if (flushRequired)
glFlush();
flushRequired = false;
}
void sendDrawMessage(DrawMessage dm) void sendDrawMessage(DrawMessage dm)
{ {
//grpmutex.lock();
//scope(exit)
// grpmutex.unlock();
if(drawMessageLength >= dmqqueuelen)
{
while(drawMessageLength)
{
SDL_Delay(1);
}
}
while(drawflag){}
if (dm.type != DrawType.CLIPWRITE) if (dm.type != DrawType.CLIPWRITE)
{ {
dm.color = petitcom.toGLColor(this.GRP[0].textureFormat, dm.color & 0xFFF8F8F8); dm.color = petitcom.toGLColor(this.GRP[0].textureFormat, dm.color & 0xFFF8F8F8);
} }
drawMessageQueue[drawMessageLength] = dm; drawMessageQueue[0] = dm;
drawMessageLength++; draw2();
flushRequired = true;
} }
void sendDrawMessage(DrawType type, byte page, short x, short y, uint color) void sendDrawMessage(DrawType type, byte page, short x, short y, uint color)
{ {

View File

@@ -555,6 +555,8 @@ class PetitComputer
{ {
return petitcomBackcolor; return petitcomBackcolor;
} }
SDL_GLContext context;
SDL_GLContext contextVM;
Object renderSync = new Object(); Object renderSync = new Object();
void render() void render()
{ {
@@ -614,14 +616,16 @@ class PetitComputer
return; return;
} }
SDL_Event event; SDL_Event event;
SDL_GLContext context; SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1);
contextVM = SDL_GL_CreateContext(window);
context = SDL_GL_CreateContext(window); context = SDL_GL_CreateContext(window);
if(!context) if(!context || !contextVM)
{ {
write("can't create OpenGL context: "); write("can't create OpenGL context: ");
writeln(SDL_GetError.to!string); writeln(SDL_GetError.to!string);
return; return;
} }
SDL_GL_MakeCurrent(window, context);
console.GRPF = graphic.createGRPF(fontFile); console.GRPF = graphic.createGRPF(fontFile);
graphic.GRPFWidth = console.GRPF.surface.w; graphic.GRPFWidth = console.GRPF.surface.w;
graphic.GRPFHeight = console.GRPF.surface.h; graphic.GRPFHeight = console.GRPF.surface.h;
@@ -651,7 +655,6 @@ class PetitComputer
glAlphaFunc(GL_GEQUAL, 0.1f); glAlphaFunc(GL_GEQUAL, 0.1f);
glEnable(GL_ALPHA_TEST); glEnable(GL_ALPHA_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
xscreen(0, 512, 4);
{ {
renderCondition.mutex.lock; renderCondition.mutex.lock;
scope (exit) scope (exit)
@@ -674,7 +677,7 @@ class PetitComputer
synchronized(renderSync) synchronized(renderSync)
{ {
glLoadIdentity(); glLoadIdentity();
graphic.draw(); //graphic.draw();
chScreen(0, 0, 400, 240); chScreen(0, 0, 400, 240);
if(xscreenmode == 1) if(xscreenmode == 1)
{ {
@@ -932,6 +935,8 @@ class PetitComputer
renderCondition.mutex.unlock; renderCondition.mutex.unlock;
renderCondition.wait(); renderCondition.wait();
} }
graphic.initVM();
xscreen(0, 512, 4);
auto startTicks = SDL_GetTicks(); auto startTicks = SDL_GetTicks();
Parser parser; Parser parser;
otya.smilebasic.vm.VM vm; otya.smilebasic.vm.VM vm;
@@ -1152,6 +1157,7 @@ class PetitComputer
vsyncFrame = 0; vsyncFrame = 0;
} }
maincnt = cast(int)((SDL_GetTicks() - startcnt) / frame); maincnt = cast(int)((SDL_GetTicks() - startcnt) / frame);
graphic.updateVM();
if(quit) if(quit)
{ {
quit = false; quit = false;