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 {