diff --git a/single_include/kompute/Kompute.hpp b/single_include/kompute/Kompute.hpp index 5d50a74c7..c77f72d3b 100755 --- a/single_include/kompute/Kompute.hpp +++ b/single_include/kompute/Kompute.hpp @@ -114,12 +114,122 @@ extern py::object kp_debug, kp_info, kp_warning, kp_error; #include #include +#include #include -#include #include namespace kp { +// The default resource limit for the GLSL compiler, can be overwritten +// Has been adobted by: +// https://github.com/KhronosGroup/glslang/blob/master/StandAlone/ResourceLimits.cpp +const TBuiltInResource defaultResource = { +/* .MaxLights = */ 0, +/* .MaxClipPlanes = */ 0, +/* .MaxTextureUnits = */ 0, +/* .MaxTextureCoords = */ 0, +/* .MaxVertexAttribs = */ 64, +/* .MaxVertexUniformComponents = */ 4096, +/* .MaxVaryingFloats = */ 64, +/* .MaxVertexTextureImageUnits = */ 0, +/* .MaxCombinedTextureImageUnits = */ 0, +/* .MaxTextureImageUnits = */ 0, +/* .MaxFragmentUniformComponents = */ 0, +/* .MaxDrawBuffers = */ 0, +/* .MaxVertexUniformVectors = */ 128, +/* .MaxVaryingVectors = */ 8, +/* .MaxFragmentUniformVectors = */ 0, +/* .MaxVertexOutputVectors = */ 16, +/* .MaxFragmentInputVectors = */ 0, +/* .MinProgramTexelOffset = */ -8, +/* .MaxProgramTexelOffset = */ 7, +/* .MaxClipDistances = */ 8, +/* .MaxComputeWorkGroupCountX = */ 65535, +/* .MaxComputeWorkGroupCountY = */ 65535, +/* .MaxComputeWorkGroupCountZ = */ 65535, +/* .MaxComputeWorkGroupSizeX = */ 1024, +/* .MaxComputeWorkGroupSizeY = */ 1024, +/* .MaxComputeWorkGroupSizeZ = */ 64, +/* .MaxComputeUniformComponents = */ 1024, +/* .MaxComputeTextureImageUnits = */ 16, +/* .MaxComputeImageUniforms = */ 8, +/* .MaxComputeAtomicCounters = */ 8, +/* .MaxComputeAtomicCounterBuffers = */ 1, +/* .MaxVaryingComponents = */ 60, +/* .MaxVertexOutputComponents = */ 64, +/* .MaxGeometryInputComponents = */ 64, +/* .MaxGeometryOutputComponents = */ 128, +/* .MaxFragmentInputComponents = */ 0, +/* .MaxImageUnits = */ 0, +/* .MaxCombinedImageUnitsAndFragmentOutputs = */ 0, +/* .MaxCombinedShaderOutputResources = */ 8, +/* .MaxImageSamples = */ 0, +/* .MaxVertexImageUniforms = */ 0, +/* .MaxTessControlImageUniforms = */ 0, +/* .MaxTessEvaluationImageUniforms = */ 0, +/* .MaxGeometryImageUniforms = */ 0, +/* .MaxFragmentImageUniforms = */ 0, +/* .MaxCombinedImageUniforms = */ 0, +/* .MaxGeometryTextureImageUnits = */ 0, +/* .MaxGeometryOutputVertices = */ 256, +/* .MaxGeometryTotalOutputComponents = */ 1024, +/* .MaxGeometryUniformComponents = */ 1024, +/* .MaxGeometryVaryingComponents = */ 64, +/* .MaxTessControlInputComponents = */ 128, +/* .MaxTessControlOutputComponents = */ 128, +/* .MaxTessControlTextureImageUnits = */ 0, +/* .MaxTessControlUniformComponents = */ 1024, +/* .MaxTessControlTotalOutputComponents = */ 4096, +/* .MaxTessEvaluationInputComponents = */ 128, +/* .MaxTessEvaluationOutputComponents = */ 128, +/* .MaxTessEvaluationTextureImageUnits = */ 16, +/* .MaxTessEvaluationUniformComponents = */ 1024, +/* .MaxTessPatchComponents = */ 120, +/* .MaxPatchVertices = */ 32, +/* .MaxTessGenLevel = */ 64, +/* .MaxViewports = */ 16, +/* .MaxVertexAtomicCounters = */ 0, +/* .MaxTessControlAtomicCounters = */ 0, +/* .MaxTessEvaluationAtomicCounters = */ 0, +/* .MaxGeometryAtomicCounters = */ 0, +/* .MaxFragmentAtomicCounters = */ 0, +/* .MaxCombinedAtomicCounters = */ 8, +/* .MaxAtomicCounterBindings = */ 1, +/* .MaxVertexAtomicCounterBuffers = */ 0, +/* .MaxTessControlAtomicCounterBuffers = */ 0, +/* .MaxTessEvaluationAtomicCounterBuffers = */ 0, +/* .MaxGeometryAtomicCounterBuffers = */ 0, +/* .MaxFragmentAtomicCounterBuffers = */ 0, +/* .MaxCombinedAtomicCounterBuffers = */ 1, +/* .MaxAtomicCounterBufferSize = */ 16384, +/* .MaxTransformFeedbackBuffers = */ 4, +/* .MaxTransformFeedbackInterleavedComponents = */ 64, +/* .MaxCullDistances = */ 8, +/* .MaxCombinedClipAndCullDistances = */ 8, +/* .MaxSamples = */ 4, +/* .maxMeshOutputVerticesNV = */ 256, +/* .maxMeshOutputPrimitivesNV = */ 512, +/* .maxMeshWorkGroupSizeX_NV = */ 32, +/* .maxMeshWorkGroupSizeY_NV = */ 1, +/* .maxMeshWorkGroupSizeZ_NV = */ 1, +/* .maxTaskWorkGroupSizeX_NV = */ 32, +/* .maxTaskWorkGroupSizeY_NV = */ 1, +/* .maxTaskWorkGroupSizeZ_NV = */ 1, +/* .maxMeshViewCountNV = */ 4, +/* .maxDualSourceDrawBuffersEXT = */ 1, + +/* .limits = */ { + /* .nonInductiveForLoops = */ 1, + /* .whileLoops = */ 1, + /* .doWhileLoops = */ 1, + /* .generalUniformIndexing = */ 1, + /* .generalAttributeMatrixVectorIndexing = */ 1, + /* .generalVaryingIndexing = */ 1, + /* .generalSamplerIndexing = */ 1, + /* .generalVariableIndexing = */ 1, + /* .generalConstantMatrixVectorIndexing = */ 1, +}}; + /** Shader utily class with functions to compile and process glsl files. */ @@ -136,13 +246,15 @@ public: * @param files A list of file names respective to each of the sources * @param entryPoint The function name to use as entry point * @param definitions List of pairs containing key value definitions + * @param resourcesLimit A list that contains the resource limits for the GLSL compiler * @return The compiled SPIR-V binary in unsigned int32 format */ static std::vector compile_sources( const std::vector& sources, const std::vector& files = {}, const std::string& entryPoint = "main", - std::vector> definitions = {}); + std::vector> definitions = {}, + const TBuiltInResource& resources = defaultResource); /** * Compile a single glslang source from string value. Currently this function @@ -154,14 +266,17 @@ public: * @param source An individual raw glsl shader in string format * @param entryPoint The function name to use as entry point * @param definitions List of pairs containing key value definitions + * @param resourcesLimit A list that contains the resource limits for the GLSL compiler * @return The compiled SPIR-V binary in unsigned int32 format */ static std::vector compile_source( const std::string& source, const std::string& entryPoint = "main", - std::vector> definitions = {}); + std::vector> definitions = {}, + const TBuiltInResource& resources = defaultResource); }; + } #endif // DKOMPUTE_DISABLE_SHADER_UTILS diff --git a/src/Shader.cpp b/src/Shader.cpp index 17429919e..cdcd66e74 100644 --- a/src/Shader.cpp +++ b/src/Shader.cpp @@ -8,7 +8,8 @@ std::vector Shader::compile_sources(const std::vector& sources, const std::vector& files, const std::string& entryPoint, - std::vector> definitions) { + std::vector> definitions, + const TBuiltInResource& resources) { // Initialize glslang library. glslang::InitializeProcess(); @@ -35,7 +36,7 @@ Shader::compile_sources(const std::vector& sources, std::string info_log = ""; const EShMessages messages = static_cast(EShMsgDefault | EShMsgVulkanRules | EShMsgSpvRules); - if (!shader.parse(&glslang::DefaultTBuiltInResource, 100, false, messages)) + if (!shader.parse(&resources, 100, false, messages)) { info_log = std::string(shader.getInfoLog()) + "\n" + std::string(shader.getInfoDebugLog()); KP_LOG_ERROR("Kompute Shader Error: {}", info_log); @@ -88,8 +89,9 @@ Shader::compile_sources(const std::vector& sources, std::vector Shader::compile_source(const std::string& source, const std::string& entryPoint, - std::vector> definitions) { - return compile_sources({source}); + std::vector> definitions, + const TBuiltInResource& resource) { + return compile_sources({source}, std::vector({}), entryPoint, definitions, resource); } } diff --git a/src/include/kompute/Shader.hpp b/src/include/kompute/Shader.hpp index 0b363ae5c..8c9a14c83 100644 --- a/src/include/kompute/Shader.hpp +++ b/src/include/kompute/Shader.hpp @@ -4,14 +4,124 @@ #include #include +#include #include -#include #include #include "kompute/Core.hpp" namespace kp { +// The default resource limit for the GLSL compiler, can be overwritten +// Has been adobted by: +// https://github.com/KhronosGroup/glslang/blob/master/StandAlone/ResourceLimits.cpp +const TBuiltInResource defaultResource = { +/* .MaxLights = */ 0, +/* .MaxClipPlanes = */ 0, +/* .MaxTextureUnits = */ 0, +/* .MaxTextureCoords = */ 0, +/* .MaxVertexAttribs = */ 64, +/* .MaxVertexUniformComponents = */ 4096, +/* .MaxVaryingFloats = */ 64, +/* .MaxVertexTextureImageUnits = */ 0, +/* .MaxCombinedTextureImageUnits = */ 0, +/* .MaxTextureImageUnits = */ 0, +/* .MaxFragmentUniformComponents = */ 0, +/* .MaxDrawBuffers = */ 0, +/* .MaxVertexUniformVectors = */ 128, +/* .MaxVaryingVectors = */ 8, +/* .MaxFragmentUniformVectors = */ 0, +/* .MaxVertexOutputVectors = */ 16, +/* .MaxFragmentInputVectors = */ 0, +/* .MinProgramTexelOffset = */ -8, +/* .MaxProgramTexelOffset = */ 7, +/* .MaxClipDistances = */ 8, +/* .MaxComputeWorkGroupCountX = */ 65535, +/* .MaxComputeWorkGroupCountY = */ 65535, +/* .MaxComputeWorkGroupCountZ = */ 65535, +/* .MaxComputeWorkGroupSizeX = */ 1024, +/* .MaxComputeWorkGroupSizeY = */ 1024, +/* .MaxComputeWorkGroupSizeZ = */ 64, +/* .MaxComputeUniformComponents = */ 1024, +/* .MaxComputeTextureImageUnits = */ 16, +/* .MaxComputeImageUniforms = */ 8, +/* .MaxComputeAtomicCounters = */ 8, +/* .MaxComputeAtomicCounterBuffers = */ 1, +/* .MaxVaryingComponents = */ 60, +/* .MaxVertexOutputComponents = */ 64, +/* .MaxGeometryInputComponents = */ 64, +/* .MaxGeometryOutputComponents = */ 128, +/* .MaxFragmentInputComponents = */ 0, +/* .MaxImageUnits = */ 0, +/* .MaxCombinedImageUnitsAndFragmentOutputs = */ 0, +/* .MaxCombinedShaderOutputResources = */ 8, +/* .MaxImageSamples = */ 0, +/* .MaxVertexImageUniforms = */ 0, +/* .MaxTessControlImageUniforms = */ 0, +/* .MaxTessEvaluationImageUniforms = */ 0, +/* .MaxGeometryImageUniforms = */ 0, +/* .MaxFragmentImageUniforms = */ 0, +/* .MaxCombinedImageUniforms = */ 0, +/* .MaxGeometryTextureImageUnits = */ 0, +/* .MaxGeometryOutputVertices = */ 256, +/* .MaxGeometryTotalOutputComponents = */ 1024, +/* .MaxGeometryUniformComponents = */ 1024, +/* .MaxGeometryVaryingComponents = */ 64, +/* .MaxTessControlInputComponents = */ 128, +/* .MaxTessControlOutputComponents = */ 128, +/* .MaxTessControlTextureImageUnits = */ 0, +/* .MaxTessControlUniformComponents = */ 1024, +/* .MaxTessControlTotalOutputComponents = */ 4096, +/* .MaxTessEvaluationInputComponents = */ 128, +/* .MaxTessEvaluationOutputComponents = */ 128, +/* .MaxTessEvaluationTextureImageUnits = */ 16, +/* .MaxTessEvaluationUniformComponents = */ 1024, +/* .MaxTessPatchComponents = */ 120, +/* .MaxPatchVertices = */ 32, +/* .MaxTessGenLevel = */ 64, +/* .MaxViewports = */ 16, +/* .MaxVertexAtomicCounters = */ 0, +/* .MaxTessControlAtomicCounters = */ 0, +/* .MaxTessEvaluationAtomicCounters = */ 0, +/* .MaxGeometryAtomicCounters = */ 0, +/* .MaxFragmentAtomicCounters = */ 0, +/* .MaxCombinedAtomicCounters = */ 8, +/* .MaxAtomicCounterBindings = */ 1, +/* .MaxVertexAtomicCounterBuffers = */ 0, +/* .MaxTessControlAtomicCounterBuffers = */ 0, +/* .MaxTessEvaluationAtomicCounterBuffers = */ 0, +/* .MaxGeometryAtomicCounterBuffers = */ 0, +/* .MaxFragmentAtomicCounterBuffers = */ 0, +/* .MaxCombinedAtomicCounterBuffers = */ 1, +/* .MaxAtomicCounterBufferSize = */ 16384, +/* .MaxTransformFeedbackBuffers = */ 4, +/* .MaxTransformFeedbackInterleavedComponents = */ 64, +/* .MaxCullDistances = */ 8, +/* .MaxCombinedClipAndCullDistances = */ 8, +/* .MaxSamples = */ 4, +/* .maxMeshOutputVerticesNV = */ 256, +/* .maxMeshOutputPrimitivesNV = */ 512, +/* .maxMeshWorkGroupSizeX_NV = */ 32, +/* .maxMeshWorkGroupSizeY_NV = */ 1, +/* .maxMeshWorkGroupSizeZ_NV = */ 1, +/* .maxTaskWorkGroupSizeX_NV = */ 32, +/* .maxTaskWorkGroupSizeY_NV = */ 1, +/* .maxTaskWorkGroupSizeZ_NV = */ 1, +/* .maxMeshViewCountNV = */ 4, +/* .maxDualSourceDrawBuffersEXT = */ 1, + +/* .limits = */ { + /* .nonInductiveForLoops = */ 1, + /* .whileLoops = */ 1, + /* .doWhileLoops = */ 1, + /* .generalUniformIndexing = */ 1, + /* .generalAttributeMatrixVectorIndexing = */ 1, + /* .generalVaryingIndexing = */ 1, + /* .generalSamplerIndexing = */ 1, + /* .generalVariableIndexing = */ 1, + /* .generalConstantMatrixVectorIndexing = */ 1, +}}; + /** Shader utily class with functions to compile and process glsl files. */ @@ -28,13 +138,15 @@ public: * @param files A list of file names respective to each of the sources * @param entryPoint The function name to use as entry point * @param definitions List of pairs containing key value definitions + * @param resourcesLimit A list that contains the resource limits for the GLSL compiler * @return The compiled SPIR-V binary in unsigned int32 format */ static std::vector compile_sources( const std::vector& sources, const std::vector& files = {}, const std::string& entryPoint = "main", - std::vector> definitions = {}); + std::vector> definitions = {}, + const TBuiltInResource& resources = defaultResource); /** * Compile a single glslang source from string value. Currently this function @@ -46,14 +158,19 @@ public: * @param source An individual raw glsl shader in string format * @param entryPoint The function name to use as entry point * @param definitions List of pairs containing key value definitions + * @param resourcesLimit A list that contains the resource limits for the GLSL compiler * @return The compiled SPIR-V binary in unsigned int32 format */ static std::vector compile_source( const std::string& source, const std::string& entryPoint = "main", - std::vector> definitions = {}); + std::vector> definitions = {}, + const TBuiltInResource& resources = defaultResource); }; + + + } #endif // DKOMPUTE_DISABLE_SHADER_UTILS