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,162 +463,122 @@ 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;
chScreen(writeArea[display].x, writeArea[display].y, writeArea[display].w, writeArea[display].h);
switch(dm.type)
{ {
DrawMessage dm = drawMessageQueue[i]; case DrawType.CLIPWRITE:
if(oldpage != dm.page) writeArea[display].x = dm.x;
{ writeArea[display].y = dm.y;
oldpage = dm.page; writeArea[display].w = dm.w;
glBindFramebufferEXT(GL_FRAMEBUFFER, this.GRP[oldpage].buffer); writeArea[display].h = dm.h;
} break;
if (display != dm.display) case DrawType.PSET:
{ glBegin(GL_POINTS);
display = dm.display; glColor4ubv(cast(ubyte*)&dm.color);
chScreen(writeArea[display].x, writeArea[display].y, writeArea[display].w, writeArea[display].h); glVertex2f(dm.x, dm.y);
} glEnd();
switch(dm.type) break;
{ case DrawType.LINE:
case DrawType.CLIPWRITE: {
writeArea[display].x = dm.x; glBegin(GL_LINES);
writeArea[display].y = dm.y;
writeArea[display].w = dm.w;
writeArea[display].h = dm.h;
chScreen(writeArea[display].x, writeArea[display].y, writeArea[display].w, writeArea[display].h);
break;
case DrawType.PSET:
glBegin(GL_POINTS);
glColor4ubv(cast(ubyte*)&dm.color); glColor4ubv(cast(ubyte*)&dm.color);
glVertex2f(dm.x, dm.y); glVertex2f(dm.x, dm.y);
glVertex2f(dm.x2, dm.y2);
//glFlush();
glEnd(); glEnd();
break; }
case DrawType.LINE: break;
case DrawType.FILL:
{
glBegin(GL_QUADS);
glColor4ubv(cast(ubyte*)&dm.color);
glVertex2f(dm.x, dm.y);
glVertex2f(dm.x, dm.y2);
glVertex2f(dm.x2, dm.y2);
glVertex2f(dm.x2, dm.y);
glEnd();
}
break;
case DrawType.BOX:
{
glBegin(GL_LINE_LOOP);
glColor4ubv(cast(ubyte*)&dm.color);
glVertex2f(dm.x, dm.y);
glVertex2f(dm.x, dm.y2);
glVertex2f(dm.x2, dm.y2);
glVertex2f(dm.x2, dm.y);
glEnd();
}
break;
case DrawType.PAINT:
{
glBindTexture(GL_TEXTURE_2D, GRP[oldpage].glTexture);
if(dt != DrawType.PAINT)
{ {
glBegin(GL_LINES); glFinish();
glColor4ubv(cast(ubyte*)&dm.color); //glGetTexImage(GL_TEXTURE_2D,0,GRP[oldpage].textureFormat,GL_UNSIGNED_BYTE,buffer.ptr);
glVertex2f(dm.x, dm.y); glReadPixels(0, 0, width, height, GRP[oldpage].textureFormat, GL_UNSIGNED_BYTE, paint.buffer.ptr);
glVertex2f(dm.x2, dm.y2);
//glFlush();
glEnd();
} }
break; paint.gpaintBuffer(paint.buffer.ptr, dm.x, dm.y, dm.color, GRP[oldpage].textureFormat);
case DrawType.FILL: //gpaintBufferExW(oldpage, dm.x, dm.y, dm.color);
{ }
glBegin(GL_QUADS); break;
glColor4ubv(cast(ubyte*)&dm.color); case DrawType.CIRCLE1:
glVertex2f(dm.x, dm.y); {
glVertex2f(dm.x, dm.y2); glColor4ubv(cast(ubyte*)&dm.color);
glVertex2f(dm.x2, dm.y2); drawCircle(dm.x, dm.y, dm.circle.r);
glVertex2f(dm.x2, dm.y); }
glEnd(); break;
} case DrawType.CIRCLE2:
break; {
case DrawType.BOX: glColor4ubv(cast(ubyte*)&dm.color);
{ drawCircle(dm.x, dm.y, dm.circle.r, dm.circle.startr, dm.circle.endr, dm.circle.flag);
glBegin(GL_LINE_LOOP); }
glColor4ubv(cast(ubyte*)&dm.color); break;
glVertex2f(dm.x, dm.y); case DrawType.PUTCHR:
glVertex2f(dm.x, dm.y2); {
glVertex2f(dm.x2, dm.y2); glColor4ubv(cast(ubyte*)&dm.color);
glVertex2f(dm.x2, dm.y); glEnable(GL_TEXTURE_2D);
glEnd(); glEnable(GL_ALPHA_TEST);
} glBindTexture(GL_TEXTURE_2D, petitcom.console.GRPF.glTexture);
break; glMatrixMode(GL_MODELVIEW);
case DrawType.PAINT: glPushMatrix();
{ glTranslatef(dm.x, dm.y, 0);
glBindTexture(GL_TEXTURE_2D, GRP[oldpage].glTexture); glScalef(dm.character.scalex, dm.character.scaley, 1);
if(dt != DrawType.PAINT) glBegin(GL_QUADS);
{ drawText(dm.character.text);
glFinish(); glEnd();
//glGetTexImage(GL_TEXTURE_2D,0,GRP[oldpage].textureFormat,GL_UNSIGNED_BYTE,buffer.ptr); glPopMatrix();
glReadPixels(0, 0, width, height, GRP[oldpage].textureFormat, GL_UNSIGNED_BYTE, paint.buffer.ptr); glDisable(GL_ALPHA_TEST);
} glDisable(GL_TEXTURE_2D);
paint.gpaintBuffer(paint.buffer.ptr, dm.x, dm.y, dm.color, GRP[oldpage].textureFormat); }
//gpaintBufferExW(oldpage, dm.x, dm.y, dm.color); break;
} default:
break;
case DrawType.CIRCLE1:
{
glColor4ubv(cast(ubyte*)&dm.color);
drawCircle(dm.x, dm.y, dm.circle.r);
}
break;
case DrawType.CIRCLE2:
{
glColor4ubv(cast(ubyte*)&dm.color);
drawCircle(dm.x, dm.y, dm.circle.r, dm.circle.startr, dm.circle.endr, dm.circle.flag);
}
break;
case DrawType.PUTCHR:
{
glColor4ubv(cast(ubyte*)&dm.color);
glEnable(GL_TEXTURE_2D);
glEnable(GL_ALPHA_TEST);
glBindTexture(GL_TEXTURE_2D, petitcom.console.GRPF.glTexture);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(dm.x, dm.y, 0);
glScalef(dm.character.scalex, dm.character.scaley, 1);
glBegin(GL_QUADS);
drawText(dm.character.text);
glEnd();
glPopMatrix();
glDisable(GL_ALPHA_TEST);
glDisable(GL_TEXTURE_2D);
}
break;
default:
}
if(SDL_GetTicks() - start >= 16 && i != len - 1)
{
s = i + 1;
goto brk;
}
dt = dm.type;
} }
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[1];
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;