From 83c2426830a1e5bdd6ee7a8021977037381ccfe0 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Wed, 18 Mar 2026 02:29:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(OpenGL):=20=E4=BF=AE=E5=A4=8D=E5=B7=A5?= =?UTF-8?q?=E5=8E=82=E6=96=B9=E6=B3=95=E8=BF=94=E5=9B=9E=20nullptr=20?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - OpenGLDevice::CreateBuffer 现在创建并返回 OpenGLBuffer 对象 - OpenGLDevice::CreateTexture 现在创建并返回 OpenGLTexture 对象 - OpenGLDevice::CreateSwapChain 现在创建并返回 OpenGLSwapChain 对象 - OpenGLDevice::CreateCommandList 现在创建并返回 OpenGLCommandList 对象 - OpenGLDevice::CreateCommandQueue 现在创建并返回 OpenGLCommandQueue 对象 - OpenGLDevice::CompileShader 现在创建并返回 OpenGLShader 对象 - OpenGLDevice::CreatePipelineState 现在创建并返回 OpenGLPipelineState 对象 - OpenGLDevice::CreateFence 现在创建并返回 OpenGLFence 对象 - OpenGLDevice::CreateSampler 现在创建并返回 OpenGLSampler 对象 --- engine/src/RHI/OpenGL/OpenGLDevice.cpp | 81 +++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 9 deletions(-) diff --git a/engine/src/RHI/OpenGL/OpenGLDevice.cpp b/engine/src/RHI/OpenGL/OpenGLDevice.cpp index 4b76af2d..02065211 100644 --- a/engine/src/RHI/OpenGL/OpenGLDevice.cpp +++ b/engine/src/RHI/OpenGL/OpenGLDevice.cpp @@ -1,5 +1,14 @@ #define GLFW_INCLUDE_NONE #include "XCEngine/RHI/OpenGL/OpenGLDevice.h" +#include "XCEngine/RHI/OpenGL/OpenGLBuffer.h" +#include "XCEngine/RHI/OpenGL/OpenGLTexture.h" +#include "XCEngine/RHI/OpenGL/OpenGLShader.h" +#include "XCEngine/RHI/OpenGL/OpenGLPipelineState.h" +#include "XCEngine/RHI/OpenGL/OpenGLFence.h" +#include "XCEngine/RHI/OpenGL/OpenGLSampler.h" +#include "XCEngine/RHI/OpenGL/OpenGLCommandList.h" +#include "XCEngine/RHI/OpenGL/OpenGLCommandQueue.h" +#include "XCEngine/RHI/OpenGL/OpenGLSwapChain.h" #include #include @@ -124,39 +133,93 @@ bool OpenGLDevice::ShouldClose() const { } RHIBuffer* OpenGLDevice::CreateBuffer(const BufferDesc& desc) { - return nullptr; + auto* buffer = new OpenGLBuffer(); + OpenGLBufferType bufferType = OpenGLBufferType::Vertex; + + switch (desc.usage) { + case ResourceUsage::IndexBuffer: + bufferType = OpenGLBufferType::Index; + break; + case ResourceUsage::ConstantBuffer: + bufferType = OpenGLBufferType::Uniform; + break; + default: + bufferType = OpenGLBufferType::Vertex; + break; + } + + buffer->Initialize(bufferType, desc.size, nullptr, desc.cpuAccess == CPUAccess::Write); + return buffer; } RHITexture* OpenGLDevice::CreateTexture(const TextureDesc& desc) { - return nullptr; + auto* texture = new OpenGLTexture(); + + OpenGLTextureType type = OpenGLTextureType::Texture2D; + switch (desc.type) { + case TextureType::Texture1D: + type = OpenGLTextureType::Texture1D; + break; + case TextureType::Texture3D: + type = OpenGLTextureType::Texture3D; + break; + case TextureType::TextureCube: + type = OpenGLTextureType::TextureCube; + break; + default: + type = OpenGLTextureType::Texture2D; + break; + } + + OpenGLFormat format = OpenGLFormat::RGBA8; + texture->Initialize(type, desc.width, desc.height, desc.depth, desc.mipLevels, format, nullptr); + return texture; } RHISwapChain* OpenGLDevice::CreateSwapChain(const SwapChainDesc& desc) { - return nullptr; + auto* swapChain = new OpenGLSwapChain(); + if (m_window) { + swapChain->Initialize(m_window, desc.width, desc.height); + } + return swapChain; } RHICommandList* OpenGLDevice::CreateCommandList(const CommandListDesc& desc) { - return nullptr; + auto* cmdList = new OpenGLCommandList(); + return cmdList; } RHICommandQueue* OpenGLDevice::CreateCommandQueue(const CommandQueueDesc& desc) { - return nullptr; + auto* queue = new OpenGLCommandQueue(); + return queue; } RHIShader* OpenGLDevice::CompileShader(const ShaderCompileDesc& desc) { - return nullptr; + auto* shader = new OpenGLShader(); + if (desc.sourceData && desc.sourceSize > 0) { + shader->Compile(static_cast(desc.sourceData), desc.sourceSize); + } else if (desc.filePath) { + shader->CompileFromFile(desc.filePath); + } + return shader; } RHIPipelineState* OpenGLDevice::CreatePipelineState(const PipelineStateDesc& desc) { - return nullptr; + auto* pso = new OpenGLPipelineState(); + return pso; } RHIFence* OpenGLDevice::CreateFence(const FenceDesc& desc) { - return nullptr; + auto* fence = new OpenGLFence(); + fence->Initialize(desc.initialValue > 0); + return fence; } RHISampler* OpenGLDevice::CreateSampler(const SamplerDesc& desc) { - return nullptr; + auto* sampler = new OpenGLSampler(); + OpenGLSamplerDesc samplerDesc = {}; + sampler->Initialize(samplerDesc); + return sampler; } const RHICapabilities& OpenGLDevice::GetCapabilities() const {