From d54774f978d295cd7bcfa05317279df3b4b689b7 Mon Sep 17 00:00:00 2001 From: kaetemi Date: Sat, 7 Sep 2013 18:33:18 +0200 Subject: [PATCH] Add abstract gpu program and source classes --- code/nel/include/nel/3d/gpu_program.h | 233 +++++++++++++++++++ code/nel/include/nel/3d/gpu_program_source.h | 91 ++++++++ code/nel/src/3d/CMakeLists.txt | 6 +- code/nel/src/3d/gpu_program.cpp | 191 +++++++++++++++ code/nel/src/3d/gpu_program_source.cpp | 47 ++++ 5 files changed, 567 insertions(+), 1 deletion(-) create mode 100644 code/nel/include/nel/3d/gpu_program.h create mode 100644 code/nel/include/nel/3d/gpu_program_source.h create mode 100644 code/nel/src/3d/gpu_program.cpp create mode 100644 code/nel/src/3d/gpu_program_source.cpp diff --git a/code/nel/include/nel/3d/gpu_program.h b/code/nel/include/nel/3d/gpu_program.h new file mode 100644 index 000000000..63d6eea88 --- /dev/null +++ b/code/nel/include/nel/3d/gpu_program.h @@ -0,0 +1,233 @@ +/** + * \file gpu_program.h + * \brief CGPUProgram + * \date 2013-09-07 15:00GMT + * \author Jan Boon (Kaetemi) + * IGPUProgram + */ + +/* + * Copyright (C) 2013 by authors + * + * This file is part of NL3D. + * NL3D is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * NL3D is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General + * Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with NL3D. If not, see + * . + */ + +#ifndef NL3D_GPU_PROGRAM_H +#define NL3D_GPU_PROGRAM_H +#include + +// STL includes + +// NeL includes +#include + +// Project includes + +namespace NL3D { + +/** + * \brief CVertexProgramInfo + * \date 2013-09-07 15:00GMT + * \author Jan Boon (Kaetemi) + * Read-only information structure. + */ +struct CVertexProgramInfo +{ +public: + std::string DisplayName; + + enum TFeatures + { + // World + // transform + + // Lights + Ambient = 0x0001, + Sun = 0x0002, + PointLight0 = 0x0004, + PointLight1 = 0x0008, + PointLight2 = 0x0010, + + // Lights, additional parameters for user shaders + /// Adds an enabled/disabled parameter to all of the lights + DynamicLights = 0x0020, + }; + + /// Bitfield containing features used by this vertex program. + uint Features; + + /// Indices of parameters used by features. + + /// Lights, NeL supports: + /// - Ambient light + uint AmbientIdx; // (Ambient) + /// - One directional light + uint SunDirectionIdx; // (Sun) + uint SunDiffuseIdx; // (Sun) + /// - Zero to three point lights + uint PointLight0PositionIdx; // (PointLight0) + uint PointLight0DiffuseIdx; // (PointLight0) + uint PointLight1PositionIdx; // (PointLight1) + uint PointLight1DiffuseIdx; // (PointLight1) + uint PointLight2PositionIdx; // (PointLight2) + uint PointLight2DiffuseIdx; // (PointLight2) + + /// DynamicLights + uint SunEnabledIdx; // (DynamicLights && Sun) + uint PointLight0EnabledIdx; // (DynamicLights && PointLight0) + uint PointLight1EnabledIdx; // (DynamicLights && PointLight1) + uint PointLight2EnabledIdx; // (DynamicLights && PointLight2) +}; + +/** + * \brief CPixelProgramInfo + * \date 2013-09-07 15:00GMT + * \author Jan Boon (Kaetemi) + * Read-only information structure. + */ +struct CPixelProgramInfo +{ +public: + std::string DisplayName; + + enum TFeatures + { + /// Use texture stages from CMaterial as texture parameters + MaterialTextures = 0x0001, + /// Set driver fog parameters on this program + Fog = 0x0002, + /// Adds an enabled/disabled parameter to the fog, for user shaders + DynamicFog = 0x0004, + }; + + // Bitfield containing features used by this pixel program + uint Features; + + // Indices of parameters used by features + uint FogEnabledIdx; // (Fog && DynamicFog) nlFogEnabled, fog enabled + uint FogStartEndIdx; // (Fog) nlFogStartEnd, start and end of fog + uint FogColorIdx; // (Fog) nlFogColor, fog color +}; + +/** + * \brief CGeometryProgramInfo + * \date 2013-09-07 15:00GMT + * \author Jan Boon (Kaetemi) + * Read-only information structure. + */ +struct CGeometryProgramInfo +{ +public: + /*enum TFeatures + { + + };*/ + /// Bitfield containing features used by this pixel program. + // uint Features; + /// Indices of parameters used by features. +}; + +/** + * \brief CGPUProgram + * \date 2013-09-07 15:00GMT + * \author Jan Boon (Kaetemi) + * A compiled GPU program + */ +class IGPUProgram : public NLMISC::CRefCount +{ +public: + enum TProfile + { + // types + // Vertex Shader = 0x01 + // Pixel Shader = 0x02 + // Geometry Shader = 0x03 + + // nel - 0x31,type,bitfield + nelvp = 0x31010001, // VP supported by CVertexProgramParser, similar to arbvp1, can be translated to vs_1_1 + + // direct3d - 0xD9,type,major,minor + // vertex programs + vs_1_1 = 0xD9010101, + vs_2_0 = 0xD9010200, + // vs_2_sw = 0xD9010201, // not sure... + // vs_2_x = 0xD9010202, // not sure... + // vs_3_0 = 0xD9010300, // not supported + // pixel programs + ps_1_1 = 0xD9020101, + ps_1_2 = 0xD9020102, + ps_1_3 = 0xD9020103, + ps_1_4 = 0xD9020104, + ps_2_0 = 0xD9020200, + // ps_2_x = 0xD9020201, // not sure... + // ps_3_0 = 0xD9020300, // not supported + + // opengl - 0x61,type,bitfield + // vertex programs + // vp20 = 0x61010001, // NV_vertex_program1_1, outdated + arbvp1 = 0x61010002, // ARB_vertex_program + vp30 = 0x61010004, // NV_vertex_program2 + vp40 = 0x61010008, // NV_vertex_program3 + NV_fragment_program3 + gp4vp = 0x61010010, // NV_gpu_program4 + gp5vp = 0x61010020, // NV_gpu_program5 + // pixel programs + // fp20 = 0x61020001, // very limited and outdated, unnecessary + // fp30 = 0x61020002, // NV_fragment_program, now arbfp1, redundant + arbfp1 = 0x61020004, // ARB_fragment_program + fp40 = 0x61020008, // NV_fragment_program2, arbfp1 with "OPTION NV_fragment_program2;\n" + gp4fp = 0x61020010, // NV_gpu_program4 + gp5fp = 0x61020020, // NV_gpu_program5 + // geometry programs + gp4gp = 0x61030001, // NV_gpu_program4 + gp5gp = 0x61030001, // NV_gpu_program5 + + // glsl - 0x65,type,version + glsl330v = 0x65010330, // GLSL vertex program version 330 + glsl330f = 0x65020330, // GLSL fragment program version 330 + glsl330g = 0x65030330, // GLSL geometry program version 330 + }; + +public: + IGPUProgram(); + virtual ~IGPUProgram(); + + /// Get the idx of a parameter (ogl: uniform, d3d: constant, etcetera) by name. Invalid name returns ~0 + virtual uint getParamIdx(char *name) const = 0; + + void buildVPInfo(const char *displayName, uint features); + void buildPPInfo(const char *displayName, uint features); + void buildGPInfo(const char *displayName, uint features); + + inline const CVertexProgramInfo *getVPInfo() const { return Info.VertexProgram; } + inline const CPixelProgramInfo *getPPInfo() const { return Info.PixelProgram; } + inline const CGeometryProgramInfo *getGPInfo() const { return Info.GeometryProgram; } + +private: + union + { + CVertexProgramInfo *VertexProgram; + CPixelProgramInfo *PixelProgram; + CGeometryProgramInfo *GeometryProgram; + void *Ptr; + } Info; + +}; /* class IGPUProgram */ + +} /* namespace NL3D */ + +#endif /* #ifndef NL3D_GPU_PROGRAM_H */ + +/* end of file */ diff --git a/code/nel/include/nel/3d/gpu_program_source.h b/code/nel/include/nel/3d/gpu_program_source.h new file mode 100644 index 000000000..7e6ba81fa --- /dev/null +++ b/code/nel/include/nel/3d/gpu_program_source.h @@ -0,0 +1,91 @@ +/** + * \file gpu_program_source.h + * \brief CGPUProgramSource + * \date 2013-09-07 14:54GMT + * \author Jan Boon (Kaetemi) + * CGPUProgramSource + */ + +/* + * Copyright (C) 2013 by authors + * + * This file is part of NL3D. + * NL3D is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * NL3D is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General + * Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with NL3D. If not, see + * . + */ + +#ifndef NL3D_GPU_PROGRAM_SOURCE_H +#define NL3D_GPU_PROGRAM_SOURCE_H +#include + +// STL includes + +// NeL includes +#include + +// Project includes +#include + +namespace NL3D { + +/** + * \brief CGPUProgramSource + * \date 2013-09-07 14:54GMT + * \author Jan Boon (Kaetemi) + * A single GPU program with a specific profile. + */ +struct CGPUProgramSource +{ +public: + std::string DisplayName; + + /// Minimal required profile for this GPU program + IGPUProgram::TProfile Profile; + + char *SourcePtr; + /// Copy the source string + inline void setSource(char *source) { SourceCopy = source; SourcePtr = &source[0]; } + /// Set pointer to source string without copying the string + inline void setSourcePtr(char *sourcePtr) { SourceCopy.clear(); SourcePtr = sourcePtr; } + + /// CVertexProgramInfo/CPixelProgramInfo/... NeL features + uint Features; + + /// Map with known parameter indices, used for assembly programs + std::map ParamIndices; + +private: + std::string SourceCopy; + +}; /* class CGPUProgramSource */ + +/** + * \brief CGPUProgramSourceCont + * \date 2013-09-07 14:54GMT + * \author Jan Boon (Kaetemi) + * Container for the source code of a single GPU program, allowing + * variations in different language profiles. + */ +struct CGPUProgramSourceCont +{ +public: + std::vector Sources; + +}; /* class CGPUProgramSourceCont */ + +} /* namespace NL3D */ + +#endif /* #ifndef NL3D_GPU_PROGRAM_SOURCE_H */ + +/* end of file */ diff --git a/code/nel/src/3d/CMakeLists.txt b/code/nel/src/3d/CMakeLists.txt index 2769d8e2d..fb5d5851a 100644 --- a/code/nel/src/3d/CMakeLists.txt +++ b/code/nel/src/3d/CMakeLists.txt @@ -166,7 +166,11 @@ SOURCE_GROUP(Driver FILES vertex_program_parse.cpp ../../include/nel/3d/vertex_program_parse.h pixel_program.cpp - ../../include/nel/3d/pixel_program.h) + ../../include/nel/3d/pixel_program.h + gpu_program.cpp + ../../include/nel/3d/gpu_program.h + gpu_program_source.cpp + ../../include/nel/3d/gpu_program_source.h) SOURCE_GROUP(Font FILES computed_string.cpp diff --git a/code/nel/src/3d/gpu_program.cpp b/code/nel/src/3d/gpu_program.cpp new file mode 100644 index 000000000..457d8b1a1 --- /dev/null +++ b/code/nel/src/3d/gpu_program.cpp @@ -0,0 +1,191 @@ +/** + * \file gpu_program.cpp + * \brief CGPUProgram + * \date 2013-09-07 15:00GMT + * \author Jan Boon (Kaetemi) + * CGPUProgram + */ + +/* + * Copyright (C) 2013 by authors + * + * This file is part of NL3D. + * NL3D is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * NL3D is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General + * Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with NL3D. If not, see + * . + */ + +#include +#include + +// STL includes + +// NeL includes +// #include +#include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace NL3D { + +IGPUProgram::IGPUProgram() +{ + Info.Ptr = NULL; +} + +IGPUProgram::~IGPUProgram() +{ + delete Info.Ptr; + Info.Ptr = NULL; +} + +void IGPUProgram::buildVPInfo(const char *displayName, uint features) +{ + nlassert(Info.VertexProgram == NULL); + Info.VertexProgram = new CVertexProgramInfo(); + CVertexProgramInfo *info = Info.VertexProgram; + info->DisplayName = displayName; + info->Features = features; + if (features & CVertexProgramInfo::Ambient) + { + info->AmbientIdx = getParamIdx("nlAmbient"); + if (info->AmbientIdx == ~0) + { + nlwarning("Missing 'nlAmbient' in gpu program '%s', Ambient disabled", displayName); + info->Features &= ~CVertexProgramInfo::Ambient; + } + } + if (features & CVertexProgramInfo::Sun) + { + if (features & CVertexProgramInfo::DynamicLights) + { + info->SunEnabledIdx = getParamIdx("nlSunEnabled"); + if (info->SunEnabledIdx == ~0) + { + nlwarning("Missing 'nlSunEnabled' in gpu program '%s', DynamicLights disabled", displayName); + info->Features &= ~CVertexProgramInfo::DynamicLights; + } + } + info->SunDirectionIdx = getParamIdx("nlSunDirection"); + info->SunDiffuseIdx = getParamIdx("nlSunDiffuse"); + if (info->SunDirectionIdx == ~0 + || info->SunDiffuseIdx == ~0) + { + nlwarning("Missing 'nlSunDirection/nlSunDiffuse' in gpu program '%s', Sun disabled", displayName); + info->Features &= ~CVertexProgramInfo::Sun; + } + } + if (features & CVertexProgramInfo::PointLight0) + { + if (features & CVertexProgramInfo::DynamicLights) + { + info->PointLight0EnabledIdx = getParamIdx("nlPointLight0Enabled"); + if (info->PointLight0EnabledIdx == ~0) + { + nlwarning("Missing 'nlPointLight0Enabled' in gpu program '%s', DynamicLights disabled", displayName); + info->Features &= ~CVertexProgramInfo::DynamicLights; + } + } + info->PointLight0PositionIdx = getParamIdx("nlPointLight0Position"); + info->PointLight0DiffuseIdx = getParamIdx("nlPointLight0Diffuse"); + if (info->PointLight0PositionIdx == ~0 + || info->PointLight0DiffuseIdx == ~0) + { + nlwarning("Missing 'nlPointLight0Position/nlPointLight0Diffuse' in gpu program '%s', PointLight0 disabled", displayName); + info->Features &= ~CVertexProgramInfo::PointLight0; + } + } + if (features & CVertexProgramInfo::PointLight1) + { + if (features & CVertexProgramInfo::DynamicLights) + { + info->PointLight1EnabledIdx = getParamIdx("nlPointLight1Enabled"); + if (info->PointLight1EnabledIdx == ~0) + { + nlwarning("Missing 'nlPointLight1Enabled' in gpu program '%s', DynamicLights disabled", displayName); + info->Features &= ~CVertexProgramInfo::DynamicLights; + } + } + info->PointLight1PositionIdx = getParamIdx("nlPointLight1Position"); + info->PointLight1DiffuseIdx = getParamIdx("nlPointLight1Diffuse"); + if (info->PointLight1PositionIdx == ~0 + || info->PointLight1DiffuseIdx == ~0) + { + nlwarning("Missing 'nlPointLight1Position/nlPointLight1Diffuse' in gpu program '%s', PointLight1 disabled", displayName); + info->Features &= ~CVertexProgramInfo::PointLight1; + } + } + if (features & CVertexProgramInfo::PointLight2) + { + if (features & CVertexProgramInfo::DynamicLights) + { + info->PointLight2EnabledIdx = getParamIdx("nlPointLight2Enabled"); + if (info->PointLight2EnabledIdx == ~0) + { + nlwarning("Missing 'nlPointLight2Enabled' in gpu program '%s', DynamicLights disabled", displayName); + info->Features &= ~CVertexProgramInfo::DynamicLights; + } + } + info->PointLight2PositionIdx = getParamIdx("nlPointLight2Position"); + info->PointLight2DiffuseIdx = getParamIdx("nlPointLight2Diffuse"); + if (info->PointLight2PositionIdx == ~0 + || info->PointLight2DiffuseIdx == ~0) + { + nlwarning("Missing 'nlPointLight2Position/nlPointLight2Diffuse' in gpu program '%s', PointLight2 disabled", displayName); + info->Features &= ~CVertexProgramInfo::PointLight2; + } + } +} + +void IGPUProgram::buildPPInfo(const char *displayName, uint features) +{ + nlassert(Info.PixelProgram == NULL); + Info.PixelProgram = new CPixelProgramInfo(); + CPixelProgramInfo *info = Info.PixelProgram; + info->DisplayName = displayName; + info->Features = features; + if (features & CPixelProgramInfo::Fog) + { + if (features & CPixelProgramInfo::DynamicFog) + { + info->FogEnabledIdx = getParamIdx("nlFogEnabled"); + if (info->FogEnabledIdx == ~0) + { + nlwarning("Missing 'nlFogEnabled' in gpu program '%s', DynamicFog disabled", displayName); + info->Features &= ~CPixelProgramInfo::DynamicFog; + } + } + info->FogStartEndIdx = getParamIdx("nlFogStartEnd"); + info->FogColorIdx = getParamIdx("nlFogColor"); + if (info->FogStartEndIdx == ~0 + || info->FogStartEndIdx == ~0) + { + nlwarning("Missing 'nlFogStartEnd/nlFogColor' in gpu program '%s', Fog disabled", displayName); + info->Features &= ~CPixelProgramInfo::Fog; + } + } +} + +void IGPUProgram::buildGPInfo(const char *displayName, uint features) +{ + nlassert(Info.GeometryProgram == NULL); + Info.GeometryProgram = new CGeometryProgramInfo(); +} + + +} /* namespace NL3D */ + +/* end of file */ diff --git a/code/nel/src/3d/gpu_program_source.cpp b/code/nel/src/3d/gpu_program_source.cpp new file mode 100644 index 000000000..21d1cc18b --- /dev/null +++ b/code/nel/src/3d/gpu_program_source.cpp @@ -0,0 +1,47 @@ +/** + * \file gpu_program_source.cpp + * \brief CGPUProgramSource + * \date 2013-09-07 14:54GMT + * \author Jan Boon (Kaetemi) + * CGPUProgramSource + */ + +/* + * Copyright (C) 2013 by authors + * + * This file is part of NL3D. + * NL3D is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * NL3D is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General + * Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with NL3D. If not, see + * . + */ + +#include +#include + +// STL includes + +// NeL includes +// #include + +// Project includes + +using namespace std; +// using namespace NLMISC; + +namespace NL3D { + +void gpu_program_source_cpp_dummy() { } + +} /* namespace NL3D */ + +/* end of file */