lovrGpuSubmit;

This commit is contained in:
bjorn 2018-12-24 20:26:47 -08:00 committed by Bjorn Swenson
parent 62645cde28
commit 55e889824f
3 changed files with 50 additions and 26 deletions

View File

@ -445,14 +445,6 @@ void lovrGraphicsFlush() {
lovrShaderSetMatrices(shader, "lovrPose", (float[16]) MAT4_IDENTITY, 0, 16);
}
// Viewport
bool stereo = !draw->mono && (canvas ? lovrCanvasIsStereo(canvas) : state.camera.stereo);
float w = (canvas ? lovrCanvasGetWidth(canvas) : state.width) >> stereo;
float h = canvas ? lovrCanvasGetHeight(canvas) : state.height;
float viewports[2][4] = { { 0, 0, w, h, }, { w, 0, w, h } };
int viewportCount = 1 + stereo;
lovrShaderSetInts(shader, "lovrViewportCount", &viewportCount, 0, 1);
// Point size
lovrShaderSetFloats(shader, "lovrPointSize", &state.pointSize, 0, 1);
@ -474,27 +466,19 @@ void lovrGraphicsFlush() {
lovrMeshFlushIndices(state.defaultMesh);
}
// Bind
lovrCanvasBind(canvas, true);
lovrGpuBindPipeline(state.pipeline);
lovrMaterialBind(material, shader);
lovrMeshBind(mesh, shader, viewportCount);
lovrShaderSetBlock(shader, "lovrDrawData", state.block, ACCESS_READ);
// Draw
if (lovrGpuGetSupported()->singlepass) {
int instances = draw->instances * viewportCount;
lovrGpuSetViewports(&viewports[0][0], viewportCount);
lovrShaderBind(shader);
lovrMeshDraw(mesh, instances);
} else {
for (int i = 0; i < viewportCount; i++) {
lovrGpuSetViewports(&viewports[i][0], 1);
lovrShaderSetInts(shader, "lovrViewportIndex", &i, 0, 1);
lovrShaderBind(shader);
lovrMeshDraw(mesh, draw->instances);
}
}
lovrGpuSubmit(&(DrawCommand) {
.mesh = mesh,
.shader = shader,
.canvas = canvas,
.pipeline = *state.pipeline,
.instances = draw->instances,
.width = canvas ? lovrCanvasGetWidth(canvas) : state.width,
.height = canvas ? lovrCanvasGetHeight(canvas) : state.height,
.stereo = !draw->mono && (canvas ? lovrCanvasIsStereo(canvas) : state.camera.stereo)
}, 1);
state.batchSize = 0;
state.batchVertex = state.vertexCursor;

View File

@ -243,6 +243,18 @@ void lovrGraphicsFill(Texture* texture, float u, float v, float w, float h);
#define lovrGraphicsCompute lovrGpuCompute
// GPU API
typedef struct {
Mesh* mesh;
Shader* shader;
Canvas* canvas;
Pipeline pipeline;
uint32_t instances;
uint32_t width : 15;
uint32_t height : 15;
bool stereo : 1;
} DrawCommand;
void lovrGpuInit(bool srgb, getProcAddressProc getProcAddress);
void lovrGpuDestroy();
void lovrGpuBindPipeline(Pipeline* pipeline);
@ -252,6 +264,7 @@ void lovrGpuDiscard(Canvas* canvas, bool color, bool depth, bool stencil);
void lovrGpuStencil(StencilAction action, int replaceValue, StencilCallback callback, void* userdata);
void lovrGpuCompute(Shader* shader, int x, int y, int z);
void lovrGpuPresent();
void lovrGpuSubmit(DrawCommand* commands, int count);
void lovrGpuDirtyTexture();
const GpuFeatures* lovrGpuGetSupported();
const GpuLimits* lovrGpuGetLimits();

View File

@ -855,6 +855,33 @@ void lovrGpuPresent() {
#endif
}
void lovrGpuSubmit(DrawCommand* commands, int count) {
for (int i = 0; i < count; i++) {
DrawCommand* draw = &commands[i];
int viewCount = 1 + draw->stereo;
int drawCount = state.features.singlepass ? 1 : viewCount;
int viewsPerDraw = state.features.singlepass ? viewCount : 1;
int instances = draw->instances * viewsPerDraw;
float w = draw->width / (float) viewCount;
float h = draw->height;
float viewports[2][4] = { { 0, 0, w, h }, { w, 0, w, h } };
lovrShaderSetInts(draw->shader, "lovrViewportCount", &viewCount, 0, 1);
lovrMeshBind(draw->mesh, draw->shader, viewsPerDraw);
lovrCanvasBind(draw->canvas, true);
lovrGpuBindPipeline(&draw->pipeline);
for (int i = 0; i < drawCount; i++) {
lovrGpuSetViewports(&viewports[i][0], viewsPerDraw);
lovrShaderSetInts(draw->shader, "lovrViewportIndex", &i, 0, 1);
lovrShaderBind(draw->shader);
lovrMeshDraw(draw->mesh, instances);
}
}
}
void lovrGpuDirtyTexture() {
state.textures[state.activeTexture] = NULL;
}