From 5634f6cce5d176973f087f6eb481933c4e8ca30f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 21 Aug 2025 21:18:18 +0000 Subject: [PATCH 1/2] Initial plan From 67861340e02eec630c6e0caf13bc7131ab532391 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 21 Aug 2025 21:23:35 +0000 Subject: [PATCH 2/2] Fix critical logical errors in byteswap functions and CUDA/OpenGL code Co-authored-by: abdlrhman08 <69439342+abdlrhman08@users.noreply.github.com> --- src/backend/dcmcore/defs.h | 6 +++--- src/core/renderer.cpp | 39 ++++++++++++++++++++++++++++++++++++-- src/cuda/render_utils.cu | 8 +++++--- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/backend/dcmcore/defs.h b/src/backend/dcmcore/defs.h index 6190600..ef8e9a0 100644 --- a/src/backend/dcmcore/defs.h +++ b/src/backend/dcmcore/defs.h @@ -36,19 +36,19 @@ inline int16_t byteswap(std::int16_t value) template <> inline uint32_t byteswap(uint32_t value) { - return std::uint32_t(byteswap(value) << 16) | byteswap(value >> 16); + return std::uint32_t(byteswap(value & 0xFFFF) << 16) | byteswap(value >> 16); } template <> inline int32_t byteswap(int32_t value) { - return std::int32_t(byteswap(value) << 16) | byteswap(value >> 16); + return std::int32_t(byteswap(value & 0xFFFF) << 16) | byteswap(value >> 16); } template <> inline uint64_t byteswap(uint64_t value) { - return std::uint64_t((unsigned long long)byteswap(value) << 32LL) | byteswap(value >> 32LL); + return std::uint64_t((unsigned long long)byteswap(value & 0xFFFFFFFFULL) << 32LL) | byteswap(value >> 32LL); } template diff --git a/src/core/renderer.cpp b/src/core/renderer.cpp index 1b3d25c..4070b30 100644 --- a/src/core/renderer.cpp +++ b/src/core/renderer.cpp @@ -80,11 +80,45 @@ void Renderer::generateInitialBuffers() { glCompileShader(GaussianFragmentShader); GLint success; + char infoLog[1024]; + + // Check PCDVertexShader compilation glGetShaderiv(PCDVertexShader, GL_COMPILE_STATUS, &success); if (!success) { - char infoLog[1024]; glGetShaderInfoLog(PCDVertexShader, sizeof(infoLog), nullptr, infoLog); - std::cerr << "ERROR::SHADER_COMPILATION_ERROR of type: " + std::cerr << "ERROR::SHADER_COMPILATION_ERROR PCDVertexShader: " + << "\n" << infoLog << "\n"; + } + + // Check PCDFragmentShader compilation + glGetShaderiv(PCDFragmentShader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(PCDFragmentShader, sizeof(infoLog), nullptr, infoLog); + std::cerr << "ERROR::SHADER_COMPILATION_ERROR PCDFragmentShader: " + << "\n" << infoLog << "\n"; + } + + // Check veryRealComputeShader compilation + glGetShaderiv(veryRealComputeShader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(veryRealComputeShader, sizeof(infoLog), nullptr, infoLog); + std::cerr << "ERROR::SHADER_COMPILATION_ERROR veryRealComputeShader: " + << "\n" << infoLog << "\n"; + } + + // Check GaussianVertexShader compilation + glGetShaderiv(GaussianVertexShader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(GaussianVertexShader, sizeof(infoLog), nullptr, infoLog); + std::cerr << "ERROR::SHADER_COMPILATION_ERROR GaussianVertexShader: " + << "\n" << infoLog << "\n"; + } + + // Check GaussianFragmentShader compilation + glGetShaderiv(GaussianFragmentShader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(GaussianFragmentShader, sizeof(infoLog), nullptr, infoLog); + std::cerr << "ERROR::SHADER_COMPILATION_ERROR GaussianFragmentShader: " << "\n" << infoLog << "\n"; } @@ -111,6 +145,7 @@ void Renderer::generateInitialBuffers() { glDeleteShader(PCDFragmentShader); glDeleteShader(veryRealComputeShader); glDeleteShader(GaussianVertexShader); + glDeleteShader(GaussianFragmentShader); } diff --git a/src/cuda/render_utils.cu b/src/cuda/render_utils.cu index 3ee5cb3..2b40227 100644 --- a/src/cuda/render_utils.cu +++ b/src/cuda/render_utils.cu @@ -24,7 +24,7 @@ void RenderUtils::sort_gaussians_gpu( cub::DeviceRadixSort::SortPairs( nullptr, _this::temp_storage_size, keys_in, keys_out, val_in, val_out, num ); - cudaMalloc(&_this::temp_storage, _this::temp_storage_size); + CHECK_CUDA(cudaMalloc(&_this::temp_storage, _this::temp_storage_size), true) newScene = false; std::cout << "New scene, needed storage of: " << _this::temp_storage_size << " bytes" @@ -45,6 +45,8 @@ void RenderUtils::sort_gaussians_gpu( void RenderUtils::cleanUp() { using _this = RenderUtils; - cudaFree(_this::temp_storage); - _this::temp_storage = nullptr; + if (_this::temp_storage != nullptr) { + cudaFree(_this::temp_storage); + _this::temp_storage = nullptr; + } }