mirror of https://github.com/bjornbytes/lovr.git
lovrGpuSubmit;
This commit is contained in:
parent
62645cde28
commit
55e889824f
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue