Handle stereo shaders better;

- Creating a shader from a DefaultShader will respect the stereo flags.
- Auto shaders will properly be stereo/nonstereo based on the target Canvas.
This commit is contained in:
bjorn 2020-01-27 16:02:08 -08:00
parent 4379d25e1c
commit 56dc8d0b9e
4 changed files with 14 additions and 12 deletions

View File

@ -1422,7 +1422,7 @@ static int l_lovrGraphicsNewShader(lua_State* L) {
lua_pop(L, 1);
}
shader = lovrShaderCreateDefault(shaderType, flags, flagCount);
shader = lovrShaderCreateDefault(shaderType, flags, flagCount, multiview);
// Builtin uniforms
if (shaderType == SHADER_STANDARD) {

View File

@ -98,7 +98,7 @@ static struct {
FrameData frameData;
bool frameDataDirty;
Canvas* defaultCanvas;
Shader* defaultShaders[MAX_DEFAULT_SHADERS];
Shader* defaultShaders[MAX_DEFAULT_SHADERS][2];
Material* defaultMaterial;
Font* defaultFont;
TextureFilter defaultFilter;
@ -197,7 +197,8 @@ void lovrGraphicsDestroy() {
lovrGraphicsSetFont(NULL);
lovrGraphicsSetCanvas(NULL);
for (int i = 0; i < MAX_DEFAULT_SHADERS; i++) {
lovrRelease(Shader, state.defaultShaders[i]);
lovrRelease(Shader, state.defaultShaders[i][false]);
lovrRelease(Shader, state.defaultShaders[i][true]);
}
for (int i = 0; i < MAX_STREAMS; i++) {
lovrRelease(Buffer, state.buffers[i]);
@ -559,7 +560,8 @@ static void lovrGraphicsBatch(BatchRequest* req) {
// Resolve objects
Mesh* mesh = req->mesh ? req->mesh : (req->instanced ? state.instancedMesh : state.mesh);
Canvas* canvas = state.canvas ? state.canvas : state.camera.canvas;
Shader* shader = state.shader ? state.shader : (state.defaultShaders[req->shader] ? state.defaultShaders[req->shader] : (state.defaultShaders[req->shader] = lovrShaderCreateDefault(req->shader, NULL, 0)));
bool stereo = lovrCanvasIsStereo(canvas);
Shader* shader = state.shader ? state.shader : (state.defaultShaders[req->shader][stereo] ? state.defaultShaders[req->shader][stereo] : (state.defaultShaders[req->shader][stereo] = lovrShaderCreateDefault(req->shader, NULL, 0, stereo)));
Pipeline* pipeline = req->pipeline ? req->pipeline : &state.pipeline;
Material* material = req->material ? req->material : (state.defaultMaterial ? state.defaultMaterial : (state.defaultMaterial = lovrMaterialCreate()));

View File

@ -61,14 +61,14 @@ static const char* getUniformTypeName(const Uniform* uniform) {
return "";
}
Shader* lovrShaderInitDefault(Shader* shader, DefaultShader type, ShaderFlag* flags, uint32_t flagCount) {
Shader* lovrShaderInitDefault(Shader* shader, DefaultShader type, ShaderFlag* flags, uint32_t flagCount, bool multiview) {
switch (type) {
case SHADER_UNLIT: return lovrShaderInitGraphics(shader, NULL, -1, NULL, -1, flags, flagCount, true);
case SHADER_STANDARD: return lovrShaderInitGraphics(shader, lovrStandardVertexShader, -1, lovrStandardFragmentShader, -1, flags, flagCount, true);
case SHADER_CUBE: return lovrShaderInitGraphics(shader, lovrCubeVertexShader, -1, lovrCubeFragmentShader, -1, flags, flagCount, true);
case SHADER_PANO: return lovrShaderInitGraphics(shader, lovrCubeVertexShader, -1, lovrPanoFragmentShader, -1, flags, flagCount, true);
case SHADER_FONT: return lovrShaderInitGraphics(shader, NULL, -1, lovrFontFragmentShader, -1, flags, flagCount, true);
case SHADER_FILL: return lovrShaderInitGraphics(shader, lovrFillVertexShader, -1, NULL, -1, flags, flagCount, true);
case SHADER_UNLIT: return lovrShaderInitGraphics(shader, NULL, -1, NULL, -1, flags, flagCount, multiview);
case SHADER_STANDARD: return lovrShaderInitGraphics(shader, lovrStandardVertexShader, -1, lovrStandardFragmentShader, -1, flags, flagCount, multiview);
case SHADER_CUBE: return lovrShaderInitGraphics(shader, lovrCubeVertexShader, -1, lovrCubeFragmentShader, -1, flags, flagCount, multiview);
case SHADER_PANO: return lovrShaderInitGraphics(shader, lovrCubeVertexShader, -1, lovrPanoFragmentShader, -1, flags, flagCount, multiview);
case SHADER_FONT: return lovrShaderInitGraphics(shader, NULL, -1, lovrFontFragmentShader, -1, flags, flagCount, multiview);
case SHADER_FILL: return lovrShaderInitGraphics(shader, lovrFillVertexShader, -1, NULL, -1, flags, flagCount, multiview);
default: lovrThrow("Unknown default shader type"); return NULL;
}
}

View File

@ -125,7 +125,7 @@ typedef struct Shader {
Shader* lovrShaderInitGraphics(Shader* shader, const char* vertexSource, int vertexSourceLength, const char* fragmentSource, int fragmentSourceLength, ShaderFlag* flags, uint32_t flagCount, bool multiview);
Shader* lovrShaderInitCompute(Shader* shader, const char* source, int length, ShaderFlag* flags, uint32_t flagCount);
Shader* lovrShaderInitDefault(Shader* shader, DefaultShader type, ShaderFlag* flags, uint32_t flagCount);
Shader* lovrShaderInitDefault(Shader* shader, DefaultShader type, ShaderFlag* flags, uint32_t flagCount, bool multiview);
#define lovrShaderCreateGraphics(...) lovrShaderInitGraphics(lovrAlloc(Shader), __VA_ARGS__)
#define lovrShaderCreateCompute(...) lovrShaderInitCompute(lovrAlloc(Shader), __VA_ARGS__)
#define lovrShaderCreateDefault(...) lovrShaderInitDefault(lovrAlloc(Shader), __VA_ARGS__)