raze-gles/source/build/src/sdlayer.cpp
2020-01-12 14:54:43 +01:00

157 lines
3.4 KiB
C++

// SDL interface layer for the Build Engine
// Use SDL 1.2 or 2.0 from http://www.libsdl.org
#include "a.h"
#include "build.h"
#include "common.h"
#include "compat.h"
#include "engine_priv.h"
#include "palette.h"
#include "baselayer.h"
#include "mmulti.h"
#include "glsurface.h"
double g_beforeSwapTime;
GameInterface* gi;
int myconnectindex, numplayers;
int connecthead, connectpoint2[MAXMULTIPLAYERS];
void ImGui_Init_Backend()
{
//ImGui_ImplSDL2_InitForOpenGL(sdl_window, sdl_context);
}
void ImGui_Begin_Frame()
{
//ImGui_ImplOpenGL3_NewFrame();
//ImGui_ImplSDL2_NewFrame(sdl_window);
//ImGui::NewFrame();
}
int32_t xres=-1, yres=-1, bpp=0, bytesperline, refreshfreq=-1;
intptr_t frameplace=0;
int32_t lockcount=0;
char modechange=1;
char offscreenrendering=0;
// Calculate ylookup[] and call setvlinebpl()
void calc_ylookup(int32_t bpl, int32_t lastyidx)
{
int32_t i, j = 0;
static int32_t ylookupsiz;
Bassert(lastyidx <= MAXYDIM);
lastyidx++;
if (lastyidx > ylookupsiz)
{
ylookup.Resize(lastyidx);
ylookupsiz = lastyidx;
}
for (i = 0; i <= lastyidx - 4; i += 4)
{
ylookup[i] = j;
ylookup[i + 1] = j + bpl;
ylookup[i + 2] = j + (bpl << 1);
ylookup[i + 3] = j + (bpl * 3);
j += (bpl << 2);
}
for (; i < lastyidx; i++)
{
ylookup[i] = j;
j += bpl;
}
setvlinebpl(bpl);
}
//
// begindrawing() -- locks the framebuffer for drawing
//
void videoBeginDrawing(void)
{
if (bpp > 8)
{
if (offscreenrendering) return;
frameplace = 0;
bytesperline = 0;
modechange = 0;
return;
}
// lock the frame
if (lockcount++ > 0)
return;
static intptr_t backupFrameplace = 0;
if (inpreparemirror)
{
//POGO: if we are offscreenrendering and we need to render a mirror
// or we are rendering a mirror and we start offscreenrendering,
// backup our offscreen target so we can restore it later
// (but only allow one level deep,
// i.e. no viewscreen showing a camera showing a mirror that reflects the same viewscreen and recursing)
if (offscreenrendering)
{
if (!backupFrameplace)
backupFrameplace = frameplace;
else if (frameplace != (intptr_t)mirrorBuffer.Data() &&
frameplace != backupFrameplace)
return;
}
frameplace = (intptr_t)mirrorBuffer.Data();
if (offscreenrendering)
return;
}
else if (offscreenrendering)
{
if (backupFrameplace)
{
frameplace = backupFrameplace;
backupFrameplace = 0;
}
return;
}
else
frameplace = (intptr_t)glsurface_getBuffer();
if (modechange)
{
bytesperline = xdim;
calc_ylookup(bytesperline, ydim);
modechange=0;
}
}
//
// enddrawing() -- unlocks the framebuffer
//
void videoEndDrawing(void)
{
if (bpp > 8)
{
if (!offscreenrendering) frameplace = 0;
return;
}
if (!frameplace) return;
if (lockcount > 1) { lockcount--; return; }
if (!offscreenrendering) frameplace = 0;
if (lockcount == 0) return;
lockcount = 0;
}
auto vsnprintfptr = vsnprintf; // This is an inline in Visual Studio but we need an address for it to satisfy the MinGW compiled libraries.