|
@@ -186,8 +186,16 @@ void Shader::createProgram(const std::vector<GLuint> &shaderids)
|
|
// Bind generic vertex attribute indices to names in the shader.
|
|
// Bind generic vertex attribute indices to names in the shader.
|
|
for (int i = 0; i < int(OpenGL::ATTRIB_MAX_ENUM); i++)
|
|
for (int i = 0; i < int(OpenGL::ATTRIB_MAX_ENUM); i++)
|
|
{
|
|
{
|
|
|
|
+ OpenGL::VertexAttrib attrib = (OpenGL::VertexAttrib) i;
|
|
|
|
+
|
|
|
|
+ // FIXME: We skip this both because pseudo-instancing is temporarily
|
|
|
|
+ // disabled (see graphics.lua), and because binding a non-existant
|
|
|
|
+ // attribute name to a location causes a shader linker warning.
|
|
|
|
+ if (attrib == OpenGL::ATTRIB_PSEUDO_INSTANCE_ID)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
const char *name = nullptr;
|
|
const char *name = nullptr;
|
|
- if (attribNames.find((OpenGL::VertexAttrib) i, name))
|
|
|
|
|
|
+ if (attribNames.find(attrib, name))
|
|
glBindAttribLocation(program, i, (const GLchar *) name);
|
|
glBindAttribLocation(program, i, (const GLchar *) name);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -247,7 +255,7 @@ void Shader::mapActiveUniforms()
|
|
}
|
|
}
|
|
|
|
|
|
// If this is a built-in (LOVE-created) uniform, store the location.
|
|
// If this is a built-in (LOVE-created) uniform, store the location.
|
|
- BuiltinExtern builtin;
|
|
|
|
|
|
+ BuiltinUniform builtin;
|
|
if (builtinNames.find(u.name.c_str(), builtin))
|
|
if (builtinNames.find(u.name.c_str(), builtin))
|
|
builtinUniforms[int(builtin)] = u.location;
|
|
builtinUniforms[int(builtin)] = u.location;
|
|
|
|
|
|
@@ -652,19 +660,36 @@ int Shader::getTextureUnit(const std::string &name)
|
|
return texunit;
|
|
return texunit;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+Shader::UniformType Shader::getExternVariable(const std::string &name, int &components, int &count)
|
|
|
|
+{
|
|
|
|
+ auto it = uniforms.find(name);
|
|
|
|
+
|
|
|
|
+ if (it == uniforms.end())
|
|
|
|
+ {
|
|
|
|
+ components = 0;
|
|
|
|
+ count = 0;
|
|
|
|
+ return UNIFORM_UNKNOWN;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ components = getUniformTypeSize(it->second.type);
|
|
|
|
+ count = (int) it->second.count;
|
|
|
|
+
|
|
|
|
+ return it->second.baseType;
|
|
|
|
+}
|
|
|
|
+
|
|
bool Shader::hasVertexAttrib(OpenGL::VertexAttrib attrib) const
|
|
bool Shader::hasVertexAttrib(OpenGL::VertexAttrib attrib) const
|
|
{
|
|
{
|
|
return vertexAttributes[int(attrib)] != -1;
|
|
return vertexAttributes[int(attrib)] != -1;
|
|
}
|
|
}
|
|
|
|
|
|
-bool Shader::hasBuiltinExtern(BuiltinExtern builtin) const
|
|
|
|
|
|
+bool Shader::hasBuiltinUniform(BuiltinUniform builtin) const
|
|
{
|
|
{
|
|
return builtinUniforms[int(builtin)] != -1;
|
|
return builtinUniforms[int(builtin)] != -1;
|
|
}
|
|
}
|
|
|
|
|
|
-bool Shader::sendBuiltinFloat(BuiltinExtern builtin, int size, const GLfloat *vec, int count)
|
|
|
|
|
|
+bool Shader::sendBuiltinFloat(BuiltinUniform builtin, int size, const GLfloat *vec, int count)
|
|
{
|
|
{
|
|
- if (!hasBuiltinExtern(builtin))
|
|
|
|
|
|
+ if (!hasBuiltinUniform(builtin))
|
|
return false;
|
|
return false;
|
|
|
|
|
|
GLint location = builtinUniforms[int(builtin)];
|
|
GLint location = builtinUniforms[int(builtin)];
|
|
@@ -754,6 +779,16 @@ bool Shader::isSupported()
|
|
return getGLSLVersion() >= "1.2";
|
|
return getGLSLVersion() >= "1.2";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+bool Shader::getConstant(const char *in, UniformType &out)
|
|
|
|
+{
|
|
|
|
+ return uniformTypes.find(in, out);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool Shader::getConstant(UniformType in, const char *&out)
|
|
|
|
+{
|
|
|
|
+ return uniformTypes.find(in, out);
|
|
|
|
+}
|
|
|
|
+
|
|
StringMap<Shader::ShaderType, Shader::TYPE_MAX_ENUM>::Entry Shader::typeNameEntries[] =
|
|
StringMap<Shader::ShaderType, Shader::TYPE_MAX_ENUM>::Entry Shader::typeNameEntries[] =
|
|
{
|
|
{
|
|
{"vertex", Shader::TYPE_VERTEX},
|
|
{"vertex", Shader::TYPE_VERTEX},
|
|
@@ -762,6 +797,17 @@ StringMap<Shader::ShaderType, Shader::TYPE_MAX_ENUM>::Entry Shader::typeNameEntr
|
|
|
|
|
|
StringMap<Shader::ShaderType, Shader::TYPE_MAX_ENUM> Shader::typeNames(Shader::typeNameEntries, sizeof(Shader::typeNameEntries));
|
|
StringMap<Shader::ShaderType, Shader::TYPE_MAX_ENUM> Shader::typeNames(Shader::typeNameEntries, sizeof(Shader::typeNameEntries));
|
|
|
|
|
|
|
|
+StringMap<Shader::UniformType, Shader::UNIFORM_MAX_ENUM>::Entry Shader::uniformTypeEntries[] =
|
|
|
|
+{
|
|
|
|
+ {"float", Shader::UNIFORM_FLOAT},
|
|
|
|
+ {"int", Shader::UNIFORM_INT},
|
|
|
|
+ {"bool", Shader::UNIFORM_BOOL},
|
|
|
|
+ {"image", Shader::UNIFORM_SAMPLER},
|
|
|
|
+ {"unknown", Shader::UNIFORM_UNKNOWN},
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+StringMap<Shader::UniformType, Shader::UNIFORM_MAX_ENUM> Shader::uniformTypes(Shader::uniformTypeEntries, sizeof(Shader::uniformTypeEntries));
|
|
|
|
+
|
|
StringMap<OpenGL::VertexAttrib, OpenGL::ATTRIB_MAX_ENUM>::Entry Shader::attribNameEntries[] =
|
|
StringMap<OpenGL::VertexAttrib, OpenGL::ATTRIB_MAX_ENUM>::Entry Shader::attribNameEntries[] =
|
|
{
|
|
{
|
|
{"love_PseudoInstanceID", OpenGL::ATTRIB_PSEUDO_INSTANCE_ID},
|
|
{"love_PseudoInstanceID", OpenGL::ATTRIB_PSEUDO_INSTANCE_ID},
|
|
@@ -769,12 +815,12 @@ StringMap<OpenGL::VertexAttrib, OpenGL::ATTRIB_MAX_ENUM>::Entry Shader::attribNa
|
|
|
|
|
|
StringMap<OpenGL::VertexAttrib, OpenGL::ATTRIB_MAX_ENUM> Shader::attribNames(Shader::attribNameEntries, sizeof(Shader::attribNameEntries));
|
|
StringMap<OpenGL::VertexAttrib, OpenGL::ATTRIB_MAX_ENUM> Shader::attribNames(Shader::attribNameEntries, sizeof(Shader::attribNameEntries));
|
|
|
|
|
|
-StringMap<Shader::BuiltinExtern, Shader::BUILTIN_MAX_ENUM>::Entry Shader::builtinNameEntries[] =
|
|
|
|
|
|
+StringMap<Shader::BuiltinUniform, Shader::BUILTIN_MAX_ENUM>::Entry Shader::builtinNameEntries[] =
|
|
{
|
|
{
|
|
{"love_ScreenSize", Shader::BUILTIN_SCREEN_SIZE},
|
|
{"love_ScreenSize", Shader::BUILTIN_SCREEN_SIZE},
|
|
};
|
|
};
|
|
|
|
|
|
-StringMap<Shader::BuiltinExtern, Shader::BUILTIN_MAX_ENUM> Shader::builtinNames(Shader::builtinNameEntries, sizeof(Shader::builtinNameEntries));
|
|
|
|
|
|
+StringMap<Shader::BuiltinUniform, Shader::BUILTIN_MAX_ENUM> Shader::builtinNames(Shader::builtinNameEntries, sizeof(Shader::builtinNameEntries));
|
|
|
|
|
|
} // opengl
|
|
} // opengl
|
|
} // graphics
|
|
} // graphics
|