implemented vsynch for d3d9 and glfw

This commit is contained in:
aap 2020-05-02 10:08:19 +02:00
parent 3704fe8a9f
commit b3ad490d1b
10 changed files with 35 additions and 15 deletions

View File

@ -356,9 +356,9 @@ Camera::clear(RGBA *col, uint32 mode)
} }
void void
Camera::showRaster(void) Camera::showRaster(uint32 flags)
{ {
engine->device.showRaster(this->frameBuffer); this->frameBuffer->show(flags);
} }
void void

View File

@ -1034,9 +1034,15 @@ clearCamera(Camera *cam, RGBA *col, uint32 mode)
} }
static void static void
showRaster(Raster *raster) showRaster(Raster *raster, uint32 flag)
{ {
// TODO: do this properly! UINT interval = flag & Raster::FLIPWAITVSYNCH ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;
if(d3d9Globals.present.PresentationInterval != interval){
d3d9Globals.present.PresentationInterval = interval;
releaseVideoMemory();
d3d::d3ddevice->Reset(&d3d9Globals.present);
restoreVideoMemory();
}
// not used but we want cameras to have rasters // not used but we want cameras to have rasters
assert(raster); assert(raster);
@ -1294,8 +1300,8 @@ startD3D(void)
d3d9Globals.present.AutoDepthStencilFormat = zformat; d3d9Globals.present.AutoDepthStencilFormat = zformat;
d3d9Globals.present.Flags = 0; d3d9Globals.present.Flags = 0;
d3d9Globals.present.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; d3d9Globals.present.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3d9Globals.present.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // d3d9Globals.present.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
// d3d9Globals.present.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; d3d9Globals.present.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
assert(d3d::d3ddevice == nil); assert(d3d::d3ddevice == nil);

View File

@ -405,7 +405,7 @@ namespace null {
void beginUpdate(Camera*) { } void beginUpdate(Camera*) { }
void endUpdate(Camera*) { } void endUpdate(Camera*) { }
void clearCamera(Camera*,RGBA*,uint32) { } void clearCamera(Camera*,RGBA*,uint32) { }
void showRaster(Raster*) { } void showRaster(Raster*,uint32) { }
void setRenderState(int32, void*) { } void setRenderState(int32, void*) { }
void *getRenderState(int32) { return 0; } void *getRenderState(int32) { return 0; }

View File

@ -761,12 +761,16 @@ clearCamera(Camera *cam, RGBA *col, uint32 mode)
} }
static void static void
showRaster(Raster *raster) showRaster(Raster *raster, uint32 flags)
{ {
// TODO: do this properly! // TODO: do this properly!
#ifdef LIBRW_SDL2 #ifdef LIBRW_SDL2
SDL_GL_SwapWindow(glGlobals.window); SDL_GL_SwapWindow(glGlobals.window);
#else #else
if(flags & Raster::FLIPWAITVSYNCH)
glfwSwapInterval(1);
else
glfwSwapInterval(0);
glfwSwapBuffers(glGlobals.window); glfwSwapBuffers(glGlobals.window);
#endif #endif
} }

View File

@ -182,6 +182,12 @@ Raster::toImage(void)
return engine->driver[this->platform]->rasterToImage(this); return engine->driver[this->platform]->rasterToImage(this);
} }
void
Raster::show(uint32 flags)
{
engine->device.showRaster(this, flags);
}
Raster* Raster*
Raster::pushContext(Raster *raster) Raster::pushContext(Raster *raster)
{ {

View File

@ -45,7 +45,7 @@ struct Device
void (*beginUpdate)(Camera*); void (*beginUpdate)(Camera*);
void (*endUpdate)(Camera*); void (*endUpdate)(Camera*);
void (*clearCamera)(Camera*, RGBA *col, uint32 mode); void (*clearCamera)(Camera*, RGBA *col, uint32 mode);
void (*showRaster)(Raster *raster); void (*showRaster)(Raster *raster, uint32 flags);
bool32 (*rasterRenderFast)(Raster *raster, int32 x, int32 y); bool32 (*rasterRenderFast)(Raster *raster, int32 x, int32 y);
void (*setRenderState)(int32 state, void *value); void (*setRenderState)(int32 state, void *value);
void *(*getRenderState)(int32 state); void *(*getRenderState)(int32 state);

View File

@ -179,6 +179,8 @@ struct RasterLevels
struct Raster struct Raster
{ {
enum { FLIPWAITVSYNCH = 1 };
PLUGINBASE PLUGINBASE
int32 platform; int32 platform;
@ -219,6 +221,8 @@ struct Raster
static int32 calculateNumLevels(int32 width, int32 height); static int32 calculateNumLevels(int32 width, int32 height);
static bool formatHasAlpha(int32 format); static bool formatHasAlpha(int32 format);
void show(uint32 flags);
static Raster *pushContext(Raster *raster); static Raster *pushContext(Raster *raster);
static Raster *popContext(void); static Raster *popContext(void);
static Raster *getCurrentContext(void); static Raster *getCurrentContext(void);
@ -698,7 +702,7 @@ struct Camera
void beginUpdate(void) { this->beginUpdateCB(this); } void beginUpdate(void) { this->beginUpdateCB(this); }
void endUpdate(void) { this->endUpdateCB(this); } void endUpdate(void) { this->endUpdateCB(this); }
void clear(RGBA *col, uint32 mode); void clear(RGBA *col, uint32 mode);
void showRaster(void); void showRaster(uint32 flags);
void setNearPlane(float32); void setNearPlane(float32);
void setFarPlane(float32); void setFarPlane(float32);
void setViewWindow(const V2d *window); void setViewWindow(const V2d *window);

View File

@ -112,7 +112,7 @@ Draw(float timeDelta)
ImGui::Render(); ImGui::Render();
Scene.camera->endUpdate(); Scene.camera->endUpdate();
Scene.camera->showRaster(); Scene.camera->showRaster(0);
} }

View File

@ -303,7 +303,7 @@ Draw(float timeDelta)
ImGui::Render(); ImGui::Render();
Scene.camera->endUpdate(); Scene.camera->endUpdate();
Scene.camera->showRaster(); Scene.camera->showRaster(0);
} }

View File

@ -338,8 +338,8 @@ im3dtest(void)
verts[i].setV(vs[i].v); verts[i].setV(vs[i].v);
} }
// rw::SetRenderStatePtr(rw::TEXTURERASTER, tex->raster); rw::SetRenderStatePtr(rw::TEXTURERASTER, tex->raster);
rw::SetRenderStatePtr(rw::TEXTURERASTER, testfont->raster); // rw::SetRenderStatePtr(rw::TEXTURERASTER, testfont->raster);
// rw::SetRenderStatePtr(rw::TEXTURERASTER, frontbuffer->raster); // rw::SetRenderStatePtr(rw::TEXTURERASTER, frontbuffer->raster);
rw::SetRenderState(rw::TEXTUREADDRESS, rw::Texture::WRAP); rw::SetRenderState(rw::TEXTUREADDRESS, rw::Texture::WRAP);
rw::SetRenderState(rw::TEXTUREFILTER, rw::Texture::NEAREST); rw::SetRenderState(rw::TEXTUREFILTER, rw::Texture::NEAREST);
@ -408,7 +408,7 @@ extern void endSoftras(void);
camera->m_rwcam->endUpdate(); camera->m_rwcam->endUpdate();
camera->m_rwcam->showRaster(); camera->m_rwcam->showRaster(0);
} }