Add glsl generation code for uniform buffer format

--HG--
branch : opengl3
hg/feature/opengl3
kaetemi 10 years ago
parent 631d91b40a
commit 8bdb4e577b

@ -17,6 +17,8 @@
#include "driver_opengl.h" #include "driver_opengl.h"
#include "driver_opengl_uniform_buffer.h" #include "driver_opengl_uniform_buffer.h"
#include <sstream>
#include <nel/misc/debug.h> #include <nel/misc/debug.h>
namespace NL3D { namespace NL3D {
@ -32,6 +34,71 @@ const char *GLSLHeaderUniformBuffer =
"#define NL_USER_PIXEL_PROGRAM_BIND " NL_MACRO_TO_STR(NL_USER_PIXEL_PROGRAM_BIND) "\n" "#define NL_USER_PIXEL_PROGRAM_BIND " NL_MACRO_TO_STR(NL_USER_PIXEL_PROGRAM_BIND) "\n"
"#define NL_USER_MATERIAL_BIND " NL_MACRO_TO_STR(NL_USER_MATERIAL_BIND) "\n"; "#define NL_USER_MATERIAL_BIND " NL_MACRO_TO_STR(NL_USER_MATERIAL_BIND) "\n";
static const char *s_UniformBufferBindDefine[] = {
"NL_BUILTIN_CAMERA_BIND",
"NL_BUILTIN_MODEL_BIND",
"NL_BUILTIN_MATERIAL_BIND",
"NL_USER_ENV_BIND",
"NL_USER_VERTEX_PROGRAM_BIND",
"NL_USER_GEOMETRY_PROGRAM_BIND",
"NL_USER_PIXEL_PROGRAM_BIND",
"NL_USER_MATERIAL_BIND",
};
static const char *s_UniformBufferName[] = {
"BuiltinCamera",
"BuiltinModel",
"BuiltinMaterial",
"UserEnv",
"UserLocal", // Yes, there can only be one per stage here, as these are bound to the stage
"UserLocal",
"UserLocal",
"UserMaterial",
};
static const char *s_TypeKeyword[] = {
"float", // float
"vec2", // CVector2D
"vec3",
"vec4", // CVector
"int", // sint32
"ivec2",
"ivec3",
"ivec3",
"unsigned int", // uint32
"uvec2",
"uvec3",
"uvec4",
"bool",
"bvec2",
"bvec3",
"bvec4",
"mat2",
"mat3",
"mat4", // CMatrix
"mat2x3",
"mat2x4",
"mat3x2",
"mat3x4",
"mat4x2",
"mat4x3",
};
void generateUniformBufferGLSL(std::stringstream &ss, const CUniformBufferFormat &ubf, sint binding)
{
ss << "layout(std140, binding = " << s_UniformBufferBindDefine[binding] << ") uniform " << s_UniformBufferName[binding] << "\n";
ss << "{\n";
for (sint i = 0; i < ubf.size(); ++i)
{
const CUniformBufferFormat::CEntry &entry = ubf.get(i);
ss << "\t" << s_TypeKeyword[entry.Type] << " " << NLMISC::CStringMapper::unmap(entry.Name);
if (entry.Count != 1)
ss << "[" << entry.Count << "]";
ss << ";\n";
}
ss << "}\n";
}
} // NLDRIVERGL3 } // NLDRIVERGL3
} // NL3D } // NL3D

@ -23,6 +23,10 @@ namespace NL3D {
namespace NLDRIVERGL3 { namespace NLDRIVERGL3 {
// NOTE: It is completely safe to reorder these indices. // NOTE: It is completely safe to reorder these indices.
// When changing, update:
// - GLSLHeaderUniformBuffer
// - s_UniformBufferBindDefine
// - s_UniformBufferBindName
// Always use the defines. // Always use the defines.
#define NL_BUILTIN_CAMERA_BIND 0 // Builtin uniform buffer bound by driver, set by camera transformation #define NL_BUILTIN_CAMERA_BIND 0 // Builtin uniform buffer bound by driver, set by camera transformation
#define NL_BUILTIN_MODEL_BIND 1 // Builtin uniform buffer bound by driver, set by model transformation #define NL_BUILTIN_MODEL_BIND 1 // Builtin uniform buffer bound by driver, set by model transformation
@ -46,6 +50,10 @@ namespace NL3D {
class CUniformBufferFormat class CUniformBufferFormat
{ {
public: public:
// When changing, update
// - s_TypeAlignment
// - s_TypeSize
// - NL3D::NLDRIVERGL3::s_TypeKeyword
enum TType enum TType
{ {
Float, // float Float, // float
@ -82,13 +90,13 @@ public:
sint Offset; sint Offset;
sint Count; sint Count;
inline sint stride() inline sint stride() const
{ {
return Count == 1 return Count == 1
? s_TypeSize[Type] ? s_TypeSize[Type]
: ((s_TypeSize[Type] + 15) & ~0xF); : ((s_TypeSize[Type] + 15) & ~0xF);
} }
inline sint size() inline sint size() const
{ {
return stride() * Count; return stride() * Count;
} }
@ -114,11 +122,12 @@ public:
entry.Type = type; entry.Type = type;
entry.Offset = alignOffset; entry.Offset = alignOffset;
entry.Count = count; entry.Count = count;
return baseOffset; return alignOffset;
} }
inline const CEntry *get() { return &m_Entries[0]; } inline const CEntry &get(sint i) const { return m_Entries[i]; }
inline size_t size() { return m_Entries.size(); } inline size_t size() const { return m_Entries.size(); }
inline void clear() { m_Entries.clear(); }
private: private:
static const sint s_TypeAlignment[]; static const sint s_TypeAlignment[];

Loading…
Cancel
Save