lovrGraphicsBlit;

This commit is contained in:
bjorn 2018-08-28 23:05:09 -07:00
parent 8bb45f4de4
commit 590668a8d6
5 changed files with 41 additions and 35 deletions

View File

@ -336,24 +336,18 @@ int l_lovrGraphicsCreateWindow(lua_State* L) {
}
int l_lovrGraphicsGetWidth(lua_State* L) {
int width;
lovrGraphicsGetDimensions(&width, NULL);
lua_pushnumber(L, width);
lua_pushnumber(L, lovrGraphicsGetWidth());
return 1;
}
int l_lovrGraphicsGetHeight(lua_State* L) {
int height;
lovrGraphicsGetDimensions(NULL, &height);
lua_pushnumber(L, height);
lua_pushnumber(L, lovrGraphicsGetHeight());
return 1;
}
int l_lovrGraphicsGetDimensions(lua_State* L) {
int width, height;
lovrGraphicsGetDimensions(&width, &height);
lua_pushnumber(L, width);
lua_pushnumber(L, height);
lua_pushnumber(L, lovrGraphicsGetWidth());
lua_pushnumber(L, lovrGraphicsGetHeight());
return 2;
}

View File

@ -106,6 +106,7 @@ void lovrGraphicsCreateWindow(int w, int h, bool fullscreen, int msaa, const cha
glfwSwapInterval(0);
#endif
glfwGetFramebufferSize(state.window, &state.width, &state.height);
lovrGpuInit(state.gammaCorrect, state.singlepass, glfwGetProcAddress);
VertexFormat format;
vertexFormatInit(&format);
@ -117,8 +118,12 @@ void lovrGraphicsCreateWindow(int w, int h, bool fullscreen, int msaa, const cha
state.initialized = true;
}
void lovrGraphicsGetDimensions(int* width, int* height) {
glfwGetFramebufferSize(state.window, width, height);
int lovrGraphicsGetWidth() {
return state.width;
}
int lovrGraphicsGetHeight() {
return state.height;
}
int lovrGraphicsGetMSAA() {
@ -127,12 +132,10 @@ int lovrGraphicsGetMSAA() {
void lovrGraphicsSetCamera(Camera* camera, bool clear) {
if (!camera) {
int width, height;
lovrGraphicsGetDimensions(&width, &height);
state.camera.canvas = NULL;
for (int i = 0; i < 2; i++) {
mat4_identity(state.camera.viewMatrix[i]);
mat4_perspective(state.camera.projection[i], .01f, 100.f, 67 * M_PI / 180., (float) width / height);
mat4_perspective(state.camera.projection[i], .01f, 100.f, 67 * M_PI / 180., (float) state.width / state.height);
}
} else {
state.camera = *camera;
@ -403,17 +406,10 @@ void lovrGraphicsDraw(DrawOptions* draw) {
}
Canvas* canvas = state.pipelines[state.pipeline].canvas ? state.pipelines[state.pipeline].canvas : state.camera.canvas;
int width, height;
if (!canvas) {
lovrGraphicsGetDimensions(&width, &height);
} else {
width = lovrCanvasGetWidth(canvas);
height = lovrCanvasGetHeight(canvas);
}
bool stereo = !draw->forceMono && (!canvas || lovrCanvasIsStereo(canvas));
int viewportCount = 1 + !!stereo;
float w = stereo ? ((float) width / 2) : width;
float h = height;
float w = (canvas ? lovrCanvasGetWidth(canvas) : state.width) >> stereo;
float h = canvas ? lovrCanvasGetHeight(canvas) : state.height;
int viewportCount = 1 + stereo;
DrawCommand command = {
.mesh = mesh,

View File

@ -160,6 +160,8 @@ typedef struct {
bool gammaCorrect;
bool singlepass;
int msaa;
int width;
int height;
void* window;
Camera camera;
Shader* defaultShaders[MAX_DEFAULT_SHADERS];
@ -178,7 +180,8 @@ void lovrGraphicsInit(bool gammaCorrect, bool singlepass);
void lovrGraphicsDestroy();
void lovrGraphicsPresent();
void lovrGraphicsCreateWindow(int w, int h, bool fullscreen, int msaa, const char* title, const char* icon);
void lovrGraphicsGetDimensions(int* width, int* height);
int lovrGraphicsGetWidth();
int lovrGraphicsGetHeight();
int lovrGraphicsGetMSAA();
void lovrGraphicsSetCamera(Camera* camera, bool clear);
GraphicsFeatures lovrGraphicsGetSupported();
@ -245,6 +248,7 @@ void lovrGraphicsSkybox(Texture* texture, float angle, float ax, float ay, float
void lovrGraphicsPrint(const char* str, mat4 transform, float wrap, HorizontalAlign halign, VerticalAlign valign);
void lovrGraphicsStencil(StencilAction action, int replaceValue, StencilCallback callback, void* userdata);
void lovrGraphicsFill(Texture* texture);
#define lovrGraphicsBlit lovrGpuBlit
#define lovrGraphicsCompute lovrGpuCompute
// GPU
@ -255,6 +259,7 @@ void lovrGpuInit(bool srgb, bool singlepass, gpuProc (*getProcAddress)(const cha
void lovrGpuDestroy();
void lovrGpuClear(Canvas* canvas, Color* color, float* depth, int* stencil);
void lovrGpuDraw(DrawCommand* command);
void lovrGpuBlit(Canvas* canvas);
void lovrGpuCompute(Shader* shader, int x, int y, int z);
void lovrGpuWait(uint8_t flags);
void lovrGpuPresent();

View File

@ -594,7 +594,11 @@ void lovrGpuDestroy() {
}
void lovrGpuClear(Canvas* canvas, Color* color, float* depth, int* stencil) {
lovrCanvasBind(canvas);
if (canvas) {
lovrCanvasBind(canvas);
} else {
lovrGpuBindFramebuffer(0);
}
if (color) {
gammaCorrectColor(color);
@ -867,7 +871,11 @@ void lovrGpuDraw(DrawCommand* command) {
lovrMeshBind(mesh, shader);
// Canvas
lovrCanvasBind(canvas);
if (canvas) {
lovrCanvasBind(canvas);
} else {
lovrGpuBindFramebuffer(0);
}
// Draw (TODEW)
int drawCount = state.supportsSinglepass ? 1 : command->viewportCount;
@ -1311,9 +1319,9 @@ void lovrCanvasSetAttachments(Canvas* canvas, Attachment* attachments, int count
}
void lovrCanvasBind(Canvas* canvas) {
lovrGpuBindFramebuffer(canvas ? canvas->framebuffer : 0);
lovrGpuBindFramebuffer(canvas->framebuffer);
if (!canvas || !canvas->dirty) {
if (!canvas->dirty) {
return;
}
@ -1354,6 +1362,13 @@ void lovrCanvasBind(Canvas* canvas) {
canvas->dirty = false;
}
void lovrGpuBlit(Canvas* canvas) {
lovrCanvasBind(canvas);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, canvas->width, canvas->height, 0, 0, lovrGraphicsGetWidth(), lovrGraphicsGetHeight(), GL_COLOR_BUFFER_BIT, GL_LINEAR);
state.framebuffer = 0;
}
bool lovrCanvasIsStereo(Canvas* canvas) {
return canvas->flags.stereo;
}

View File

@ -692,11 +692,7 @@ static void openvrRenderTo(void (*callback)(void*), void* userdata) {
lovrGpuDirtyTexture(0);
if (state.isMirrored) {
lovrGraphicsPushPipeline();
lovrGraphicsSetColor((Color) { 1, 1, 1, 1 });
lovrGraphicsSetShader(NULL);
lovrGraphicsFill(attachments[0].texture);
lovrGraphicsPopPipeline();
lovrGraphicsBlit(state.canvas);
}
}