refactor: Refactor OpenGL backend to use OpenGLEnums

Use centralized OpenGLEnums.h for enum conversion:
- Remove local ToGL* functions from OpenGLCommandList
- Replace with ToOpenGL() and ToOpenGLClearBuffer() from OpenGLEnums
- Simplify OpenGLTexture, OpenGLBuffer, OpenGLSampler, etc.
This commit is contained in:
2026-03-25 19:01:36 +08:00
parent 773d1aa38a
commit 712e975610
13 changed files with 108 additions and 297 deletions

View File

@@ -39,7 +39,7 @@ public:
RHISwapChain* CreateSwapChain(const SwapChainDesc& desc) override; RHISwapChain* CreateSwapChain(const SwapChainDesc& desc) override;
RHICommandList* CreateCommandList(const CommandListDesc& desc) override; RHICommandList* CreateCommandList(const CommandListDesc& desc) override;
RHICommandQueue* CreateCommandQueue(const CommandQueueDesc& desc) override; RHICommandQueue* CreateCommandQueue(const CommandQueueDesc& desc) override;
RHIShader* CompileShader(const ShaderCompileDesc& desc) override; RHIShader* CreateShader(const ShaderCompileDesc& desc) override;
RHIPipelineState* CreatePipelineState(const GraphicsPipelineDesc& desc) override; RHIPipelineState* CreatePipelineState(const GraphicsPipelineDesc& desc) override;
RHIPipelineLayout* CreatePipelineLayout(const RHIPipelineLayoutDesc& desc) override; RHIPipelineLayout* CreatePipelineLayout(const RHIPipelineLayoutDesc& desc) override;
RHIFence* CreateFence(const FenceDesc& desc) override; RHIFence* CreateFence(const FenceDesc& desc) override;

View File

@@ -2,6 +2,7 @@
#include <cstdint> #include <cstdint>
#include <string> #include <string>
#include "../RHIScreenshot.h"
namespace XCEngine { namespace XCEngine {
namespace RHI { namespace RHI {
@@ -9,8 +10,11 @@ namespace RHI {
class OpenGLSwapChain; class OpenGLSwapChain;
class OpenGLDevice; class OpenGLDevice;
class OpenGLScreenshot { class OpenGLScreenshot : public RHIScreenshot {
public: public:
bool Capture(RHIDevice* device, RHISwapChain* swapChain, const char* filename) override;
void Shutdown() override {}
static bool Capture(OpenGLDevice& device, static bool Capture(OpenGLDevice& device,
OpenGLSwapChain& swapChain, OpenGLSwapChain& swapChain,
const char* filename); const char* filename);
@@ -23,7 +27,8 @@ public:
private: private:
static bool SavePPM(const char* filename, static bool SavePPM(const char* filename,
int width, int height); int width,
int height);
}; };
} // namespace RHI } // namespace RHI

View File

@@ -1,24 +1,10 @@
#include "XCEngine/RHI/OpenGL/OpenGLBuffer.h" #include "XCEngine/RHI/OpenGL/OpenGLBuffer.h"
#include "XCEngine/RHI/OpenGL/OpenGLEnums.h"
#include <glad/glad.h> #include <glad/glad.h>
namespace XCEngine { namespace XCEngine {
namespace RHI { namespace RHI {
static unsigned int ToGLBufferTarget(OpenGLBufferType type) {
switch (type) {
case OpenGLBufferType::Vertex: return GL_ARRAY_BUFFER;
case OpenGLBufferType::Index: return GL_ELEMENT_ARRAY_BUFFER;
case OpenGLBufferType::Uniform: return GL_UNIFORM_BUFFER;
case OpenGLBufferType::CopyRead: return GL_COPY_READ_BUFFER;
case OpenGLBufferType::CopyWrite: return GL_COPY_WRITE_BUFFER;
case OpenGLBufferType::AtomicCounter: return GL_ATOMIC_COUNTER_BUFFER;
case OpenGLBufferType::DispatchIndirect: return GL_DISPATCH_INDIRECT_BUFFER;
case OpenGLBufferType::DrawIndirect: return GL_DRAW_INDIRECT_BUFFER;
case OpenGLBufferType::ShaderBindingTable: return GL_SHADER_STORAGE_BUFFER;
default: return GL_ARRAY_BUFFER;
}
}
OpenGLBuffer::OpenGLBuffer() OpenGLBuffer::OpenGLBuffer()
: m_buffer(0) : m_buffer(0)
, m_size(0) , m_size(0)
@@ -37,7 +23,7 @@ bool OpenGLBuffer::Initialize(OpenGLBufferType type, size_t size, const void* da
m_dynamic = dynamic; m_dynamic = dynamic;
m_isIndexBuffer = (type == OpenGLBufferType::Index); m_isIndexBuffer = (type == OpenGLBufferType::Index);
unsigned int target = ToGLBufferTarget(type); unsigned int target = ToOpenGL(type);
GLenum usage = dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; GLenum usage = dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW;
glGenBuffers(1, &m_buffer); glGenBuffers(1, &m_buffer);
@@ -64,12 +50,12 @@ void OpenGLBuffer::Shutdown() {
} }
void OpenGLBuffer::Bind() const { void OpenGLBuffer::Bind() const {
unsigned int target = ToGLBufferTarget(m_type); unsigned int target = ToOpenGL(m_type);
glBindBuffer(target, m_buffer); glBindBuffer(target, m_buffer);
} }
void OpenGLBuffer::Unbind() const { void OpenGLBuffer::Unbind() const {
unsigned int target = ToGLBufferTarget(m_type); unsigned int target = ToOpenGL(m_type);
glBindBuffer(target, 0); glBindBuffer(target, 0);
} }
@@ -78,7 +64,7 @@ void OpenGLBuffer::BindBase(unsigned int target, unsigned int index) const {
} }
void* OpenGLBuffer::Map() { void* OpenGLBuffer::Map() {
unsigned int target = ToGLBufferTarget(m_type); unsigned int target = ToOpenGL(m_type);
glBindBuffer(target, m_buffer); glBindBuffer(target, m_buffer);
void* ptr = glMapBuffer(target, GL_WRITE_ONLY); void* ptr = glMapBuffer(target, GL_WRITE_ONLY);
glBindBuffer(target, 0); glBindBuffer(target, 0);
@@ -86,14 +72,14 @@ void* OpenGLBuffer::Map() {
} }
void OpenGLBuffer::Unmap() { void OpenGLBuffer::Unmap() {
unsigned int target = ToGLBufferTarget(m_type); unsigned int target = ToOpenGL(m_type);
glBindBuffer(target, m_buffer); glBindBuffer(target, m_buffer);
glUnmapBuffer(target); glUnmapBuffer(target);
glBindBuffer(target, 0); glBindBuffer(target, 0);
} }
void OpenGLBuffer::SetData(const void* data, size_t size, size_t offset) { void OpenGLBuffer::SetData(const void* data, size_t size, size_t offset) {
unsigned int target = ToGLBufferTarget(m_type); unsigned int target = ToOpenGL(m_type);
glBindBuffer(target, m_buffer); glBindBuffer(target, m_buffer);
if (offset == 0 && size == m_size) { if (offset == 0 && size == m_size) {
glBufferData(target, size, data, m_dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); glBufferData(target, size, data, m_dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);

View File

@@ -5,26 +5,12 @@
#include "XCEngine/RHI/OpenGL/OpenGLFramebuffer.h" #include "XCEngine/RHI/OpenGL/OpenGLFramebuffer.h"
#include "XCEngine/RHI/OpenGL/OpenGLRenderPass.h" #include "XCEngine/RHI/OpenGL/OpenGLRenderPass.h"
#include "XCEngine/RHI/OpenGL/OpenGLDescriptorSet.h" #include "XCEngine/RHI/OpenGL/OpenGLDescriptorSet.h"
#include "XCEngine/RHI/OpenGL/OpenGLEnums.h"
#include <glad/glad.h> #include <glad/glad.h>
namespace XCEngine { namespace XCEngine {
namespace RHI { namespace RHI {
static unsigned int ToGLPrimitiveType(PrimitiveType type) {
switch (type) {
case PrimitiveType::Points: return GL_POINTS;
case PrimitiveType::Lines: return GL_LINES;
case PrimitiveType::LineStrip: return GL_LINE_STRIP;
case PrimitiveType::Triangles: return GL_TRIANGLES;
case PrimitiveType::TriangleStrip: return GL_TRIANGLE_STRIP;
case PrimitiveType::TriangleFan: return GL_TRIANGLE_FAN;
case PrimitiveType::LineListAdj: return GL_LINES_ADJACENCY;
case PrimitiveType::TriangleListAdj: return GL_TRIANGLES_ADJACENCY;
case PrimitiveType::Patch: return GL_PATCHES;
default: return GL_TRIANGLES;
}
}
OpenGLCommandList::OpenGLCommandList() OpenGLCommandList::OpenGLCommandList()
: m_primitiveType(GL_TRIANGLES) : m_primitiveType(GL_TRIANGLES)
, m_currentVAO(0) , m_currentVAO(0)
@@ -37,11 +23,7 @@ OpenGLCommandList::~OpenGLCommandList() {
void OpenGLCommandList::Clear(float r, float g, float b, float a, unsigned int buffers) { void OpenGLCommandList::Clear(float r, float g, float b, float a, unsigned int buffers) {
glClearColor(r, g, b, a); glClearColor(r, g, b, a);
unsigned int glBuffers = 0; glClear(ToOpenGLClearBuffer(buffers));
if (buffers & 1) glBuffers |= GL_COLOR_BUFFER_BIT;
if (buffers & 2) glBuffers |= GL_DEPTH_BUFFER_BIT;
if (buffers & 4) glBuffers |= GL_STENCIL_BUFFER_BIT;
glClear(glBuffers);
} }
void OpenGLCommandList::ClearColor(float r, float g, float b, float a) { void OpenGLCommandList::ClearColor(float r, float g, float b, float a) {
@@ -206,35 +188,35 @@ void OpenGLCommandList::SetPolygonOffset(float factor, float units) {
} }
void OpenGLCommandList::SetPrimitiveType(PrimitiveType type) { void OpenGLCommandList::SetPrimitiveType(PrimitiveType type) {
m_primitiveType = ToGLPrimitiveType(type); m_primitiveType = ToOpenGL(type);
} }
void OpenGLCommandList::Draw(PrimitiveType type, unsigned int vertexCount, unsigned int startVertex) { void OpenGLCommandList::Draw(PrimitiveType type, unsigned int vertexCount, unsigned int startVertex) {
m_primitiveType = ToGLPrimitiveType(type); m_primitiveType = ToOpenGL(type);
glDrawArrays(m_primitiveType, startVertex, vertexCount); glDrawArrays(m_primitiveType, startVertex, vertexCount);
} }
void OpenGLCommandList::DrawInstanced(PrimitiveType type, unsigned int vertexCount, unsigned int instanceCount, unsigned int startVertex, unsigned int startInstance) { void OpenGLCommandList::DrawInstanced(PrimitiveType type, unsigned int vertexCount, unsigned int instanceCount, unsigned int startVertex, unsigned int startInstance) {
m_primitiveType = ToGLPrimitiveType(type); m_primitiveType = ToOpenGL(type);
glDrawArraysInstanced(m_primitiveType, startVertex, vertexCount, instanceCount); glDrawArraysInstanced(m_primitiveType, startVertex, vertexCount, instanceCount);
(void)startInstance; (void)startInstance;
} }
void OpenGLCommandList::DrawIndexed(PrimitiveType type, unsigned int indexCount, unsigned int startIndex, int baseVertex) { void OpenGLCommandList::DrawIndexed(PrimitiveType type, unsigned int indexCount, unsigned int startIndex, int baseVertex) {
m_primitiveType = ToGLPrimitiveType(type); m_primitiveType = ToOpenGL(type);
glDrawElements(m_primitiveType, indexCount, GL_UNSIGNED_INT, (void*)(startIndex * sizeof(unsigned int))); glDrawElements(m_primitiveType, indexCount, GL_UNSIGNED_INT, (void*)(startIndex * sizeof(unsigned int)));
(void)baseVertex; (void)baseVertex;
} }
void OpenGLCommandList::DrawIndexedInstanced(PrimitiveType type, unsigned int indexCount, unsigned int instanceCount, unsigned int startIndex, int baseVertex, unsigned int startInstance) { void OpenGLCommandList::DrawIndexedInstanced(PrimitiveType type, unsigned int indexCount, unsigned int instanceCount, unsigned int startIndex, int baseVertex, unsigned int startInstance) {
m_primitiveType = ToGLPrimitiveType(type); m_primitiveType = ToOpenGL(type);
glDrawElementsInstanced(m_primitiveType, indexCount, GL_UNSIGNED_INT, (void*)(startIndex * sizeof(unsigned int)), instanceCount); glDrawElementsInstanced(m_primitiveType, indexCount, GL_UNSIGNED_INT, (void*)(startIndex * sizeof(unsigned int)), instanceCount);
(void)baseVertex; (void)baseVertex;
(void)startInstance; (void)startInstance;
} }
void OpenGLCommandList::DrawIndirect(PrimitiveType type, unsigned int buffer, size_t offset, unsigned int drawCount, unsigned int stride) { void OpenGLCommandList::DrawIndirect(PrimitiveType type, unsigned int buffer, size_t offset, unsigned int drawCount, unsigned int stride) {
m_primitiveType = ToGLPrimitiveType(type); m_primitiveType = ToOpenGL(type);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, buffer); glBindBuffer(GL_DRAW_INDIRECT_BUFFER, buffer);
glDrawArraysIndirect(m_primitiveType, (void*)offset); glDrawArraysIndirect(m_primitiveType, (void*)offset);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0); glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);
@@ -243,7 +225,7 @@ void OpenGLCommandList::DrawIndirect(PrimitiveType type, unsigned int buffer, si
} }
void OpenGLCommandList::DrawIndexedIndirect(PrimitiveType type, unsigned int buffer, size_t offset, unsigned int drawCount, unsigned int stride) { void OpenGLCommandList::DrawIndexedIndirect(PrimitiveType type, unsigned int buffer, size_t offset, unsigned int drawCount, unsigned int stride) {
m_primitiveType = ToGLPrimitiveType(type); m_primitiveType = ToOpenGL(type);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, buffer); glBindBuffer(GL_DRAW_INDIRECT_BUFFER, buffer);
glDrawElementsIndirect(m_primitiveType, GL_UNSIGNED_INT, (void*)offset); glDrawElementsIndirect(m_primitiveType, GL_UNSIGNED_INT, (void*)offset);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0); glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);
@@ -252,12 +234,12 @@ void OpenGLCommandList::DrawIndexedIndirect(PrimitiveType type, unsigned int buf
} }
void OpenGLCommandList::MultiDrawArrays(PrimitiveType type, const int* first, const int* count, unsigned int drawCount) { void OpenGLCommandList::MultiDrawArrays(PrimitiveType type, const int* first, const int* count, unsigned int drawCount) {
m_primitiveType = ToGLPrimitiveType(type); m_primitiveType = ToOpenGL(type);
glMultiDrawArrays(m_primitiveType, first, count, drawCount); glMultiDrawArrays(m_primitiveType, first, count, drawCount);
} }
void OpenGLCommandList::MultiDrawElements(PrimitiveType type, const int* count, unsigned int type_, const void* const* indices, unsigned int drawCount) { void OpenGLCommandList::MultiDrawElements(PrimitiveType type, const int* count, unsigned int type_, const void* const* indices, unsigned int drawCount) {
m_primitiveType = ToGLPrimitiveType(type); m_primitiveType = ToOpenGL(type);
glMultiDrawElements(m_primitiveType, count, type_, indices, drawCount); glMultiDrawElements(m_primitiveType, count, type_, indices, drawCount);
} }
@@ -566,7 +548,7 @@ void OpenGLCommandList::SetRenderTargets(uint32_t count, RHIResourceView** rende
std::vector<GLenum> drawBuffers(count); std::vector<GLenum> drawBuffers(count);
for (uint32_t i = 0; i < count; ++i) { for (uint32_t i = 0; i < count; ++i) {
drawBuffers[i] = GL_COLOR_ATTACHMENT0 + i; drawBuffers[i] = ToOpenGLColorAttachment(i);
} }
glDrawBuffers(count, drawBuffers.data()); glDrawBuffers(count, drawBuffers.data());
@@ -700,86 +682,8 @@ void OpenGLCommandList::DrawIndexed(uint32_t indexCount, uint32_t instanceCount,
reinterpret_cast<const void*>(startIndex * sizeof(GLuint)), static_cast<GLsizei>(instanceCount)); reinterpret_cast<const void*>(startIndex * sizeof(GLuint)), static_cast<GLsizei>(instanceCount));
} }
static unsigned int ToGLPrimitiveTopology(PrimitiveTopology topology) {
switch (topology) {
case PrimitiveTopology::PointList: return GL_POINTS;
case PrimitiveTopology::LineList: return GL_LINES;
case PrimitiveTopology::LineStrip: return GL_LINE_STRIP;
case PrimitiveTopology::TriangleList: return GL_TRIANGLES;
case PrimitiveTopology::TriangleStrip: return GL_TRIANGLE_STRIP;
case PrimitiveTopology::LineListAdj: return GL_LINES_ADJACENCY;
case PrimitiveTopology::LineStripAdj: return GL_LINE_STRIP_ADJACENCY;
case PrimitiveTopology::TriangleListAdj: return GL_TRIANGLES_ADJACENCY;
case PrimitiveTopology::TriangleStripAdj: return GL_TRIANGLE_STRIP_ADJACENCY;
case PrimitiveTopology::PatchList: return GL_PATCHES;
default: return GL_TRIANGLES;
}
}
static unsigned int ToGLComparisonFunc(ComparisonFunc func) {
switch (func) {
case ComparisonFunc::Never: return GL_NEVER;
case ComparisonFunc::Less: return GL_LESS;
case ComparisonFunc::Equal: return GL_EQUAL;
case ComparisonFunc::LessEqual: return GL_LEQUAL;
case ComparisonFunc::Greater: return GL_GREATER;
case ComparisonFunc::NotEqual: return GL_NOTEQUAL;
case ComparisonFunc::GreaterEqual: return GL_GEQUAL;
case ComparisonFunc::Always: return GL_ALWAYS;
default: return GL_LESS;
}
}
static unsigned int ToGLStencilOp(StencilOp op) {
switch (op) {
case StencilOp::Keep: return GL_KEEP;
case StencilOp::Zero: return GL_ZERO;
case StencilOp::Replace: return GL_REPLACE;
case StencilOp::IncrSat: return GL_INCR;
case StencilOp::DecrSat: return GL_DECR;
case StencilOp::Invert: return GL_INVERT;
case StencilOp::Incr: return GL_INCR_WRAP;
case StencilOp::Decr: return GL_DECR_WRAP;
default: return GL_KEEP;
}
}
static unsigned int ToGLBlendFactor(BlendFactor factor) {
switch (factor) {
case BlendFactor::Zero: return GL_ZERO;
case BlendFactor::One: return GL_ONE;
case BlendFactor::SrcColor: return GL_SRC_COLOR;
case BlendFactor::InvSrcColor: return GL_ONE_MINUS_SRC_COLOR;
case BlendFactor::SrcAlpha: return GL_SRC_ALPHA;
case BlendFactor::InvSrcAlpha: return GL_ONE_MINUS_SRC_ALPHA;
case BlendFactor::DstAlpha: return GL_DST_ALPHA;
case BlendFactor::InvDstAlpha: return GL_ONE_MINUS_DST_ALPHA;
case BlendFactor::DstColor: return GL_DST_COLOR;
case BlendFactor::InvDstColor: return GL_ONE_MINUS_DST_COLOR;
case BlendFactor::SrcAlphaSat: return GL_SRC_ALPHA_SATURATE;
case BlendFactor::BlendFactor: return GL_CONSTANT_COLOR;
case BlendFactor::InvBlendFactor: return GL_ONE_MINUS_CONSTANT_COLOR;
case BlendFactor::Src1Color: return GL_SRC1_COLOR;
case BlendFactor::InvSrc1Color: return GL_ONE_MINUS_SRC1_COLOR;
case BlendFactor::Src1Alpha: return GL_SRC1_ALPHA;
case BlendFactor::InvSrc1Alpha: return GL_ONE_MINUS_SRC1_ALPHA;
default: return GL_ONE;
}
}
static unsigned int ToGLBlendOp(BlendOp op) {
switch (op) {
case BlendOp::Add: return GL_FUNC_ADD;
case BlendOp::Subtract: return GL_FUNC_SUBTRACT;
case BlendOp::ReverseSubtract: return GL_FUNC_REVERSE_SUBTRACT;
case BlendOp::Min: return GL_MIN;
case BlendOp::Max: return GL_MAX;
default: return GL_FUNC_ADD;
}
}
void OpenGLCommandList::SetPrimitiveTopology(PrimitiveTopology topology) { void OpenGLCommandList::SetPrimitiveTopology(PrimitiveTopology topology) {
m_primitiveType = ToGLPrimitiveTopology(topology); m_primitiveType = ToOpenGL(topology);
} }
void OpenGLCommandList::SetStencilRef(uint8_t ref) { void OpenGLCommandList::SetStencilRef(uint8_t ref) {

View File

@@ -1,4 +1,5 @@
#include "XCEngine/RHI/OpenGL/OpenGLDepthStencilView.h" #include "XCEngine/RHI/OpenGL/OpenGLDepthStencilView.h"
#include "XCEngine/RHI/OpenGL/OpenGLEnums.h"
#include <glad/glad.h> #include <glad/glad.h>
namespace XCEngine { namespace XCEngine {
@@ -26,18 +27,15 @@ bool OpenGLDepthStencilView::Initialize(unsigned int texture, const OpenGLDepthS
glGenFramebuffers(1, &m_framebuffer); glGenFramebuffers(1, &m_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
GLenum depthAttachment = GL_DEPTH_ATTACHMENT;
GLenum stencilAttachment = GL_STENCIL_ATTACHMENT;
switch (desc.type) { switch (desc.type) {
case DepthStencilType::Texture2D: case DepthStencilType::Texture2D:
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texture, desc.mipLevel); glFramebufferTexture2D(GL_FRAMEBUFFER, ToOpenGLDepthAttachment(), GL_TEXTURE_2D, texture, desc.mipLevel);
break; break;
case DepthStencilType::Texture2DArray: case DepthStencilType::Texture2DArray:
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, texture, desc.mipLevel, desc.baseArraySlice); glFramebufferTextureLayer(GL_FRAMEBUFFER, ToOpenGLDepthAttachment(), texture, desc.mipLevel, desc.baseArraySlice);
break; break;
case DepthStencilType::TextureCube: case DepthStencilType::TextureCube:
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + desc.baseArraySlice, texture, desc.mipLevel); glFramebufferTexture2D(GL_FRAMEBUFFER, ToOpenGLDepthAttachment(), GL_TEXTURE_CUBE_MAP_POSITIVE_X + desc.baseArraySlice, texture, desc.mipLevel);
break; break;
} }
@@ -63,7 +61,7 @@ bool OpenGLDepthStencilView::InitializeCubemap(unsigned int cubemap, int face, i
glGenFramebuffers(1, &m_framebuffer); glGenFramebuffers(1, &m_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, cubemap, mipLevel); glFramebufferTexture2D(GL_FRAMEBUFFER, ToOpenGLDepthAttachment(), GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, cubemap, mipLevel);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);

View File

@@ -353,7 +353,7 @@ RHICommandQueue* OpenGLDevice::CreateCommandQueue(const CommandQueueDesc& desc)
return queue; return queue;
} }
RHIShader* OpenGLDevice::CompileShader(const ShaderCompileDesc& desc) { RHIShader* OpenGLDevice::CreateShader(const ShaderCompileDesc& desc) {
auto* shader = new OpenGLShader(); auto* shader = new OpenGLShader();
if (desc.sourceLanguage == ShaderLanguage::GLSL && !desc.source.empty()) { if (desc.sourceLanguage == ShaderLanguage::GLSL && !desc.source.empty()) {

View File

@@ -1,5 +1,6 @@
#include "XCEngine/RHI/OpenGL/OpenGLFramebuffer.h" #include "XCEngine/RHI/OpenGL/OpenGLFramebuffer.h"
#include "XCEngine/RHI/OpenGL/OpenGLResourceView.h" #include "XCEngine/RHI/OpenGL/OpenGLResourceView.h"
#include "XCEngine/RHI/OpenGL/OpenGLEnums.h"
#include <glad/glad.h> #include <glad/glad.h>
namespace XCEngine { namespace XCEngine {
@@ -30,7 +31,7 @@ bool OpenGLFramebuffer::Initialize(const FramebufferDesc& desc) {
for (size_t i = 0; i < desc.colorAttachments.size() && i < 16; ++i) { for (size_t i = 0; i < desc.colorAttachments.size() && i < 16; ++i) {
const auto& attachment = desc.colorAttachments[i]; const auto& attachment = desc.colorAttachments[i];
GLenum glAttachment = GL_COLOR_ATTACHMENT0 + static_cast<GLenum>(i); GLenum glAttachment = ToOpenGLColorAttachment(static_cast<uint32_t>(i));
switch (attachment.type) { switch (attachment.type) {
case FramebufferAttachmentType::Color: case FramebufferAttachmentType::Color:
@@ -47,9 +48,9 @@ bool OpenGLFramebuffer::Initialize(const FramebufferDesc& desc) {
} }
if (desc.depthAttachment.texture != 0) { if (desc.depthAttachment.texture != 0) {
GLenum depthAttachment = GL_DEPTH_ATTACHMENT; GLenum depthAttachment = ToOpenGLDepthAttachment();
if (desc.stencilAttachment.texture != 0) { if (desc.stencilAttachment.texture != 0) {
depthAttachment = GL_DEPTH_STENCIL_ATTACHMENT; depthAttachment = ToOpenGLDepthStencilAttachment();
} }
if (desc.depthAttachment.layer == 0 && desc.depthAttachment.mipLevel == 0) { if (desc.depthAttachment.layer == 0 && desc.depthAttachment.mipLevel == 0) {
@@ -62,12 +63,13 @@ bool OpenGLFramebuffer::Initialize(const FramebufferDesc& desc) {
} }
if (desc.stencilAttachment.texture != 0 && desc.stencilAttachment.texture != desc.depthAttachment.texture) { if (desc.stencilAttachment.texture != 0 && desc.stencilAttachment.texture != desc.depthAttachment.texture) {
GLenum stencilAttachment = ToOpenGLStencilAttachment();
if (desc.stencilAttachment.layer == 0 && desc.stencilAttachment.mipLevel == 0) { if (desc.stencilAttachment.layer == 0 && desc.stencilAttachment.mipLevel == 0) {
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, desc.stencilAttachment.texture, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, stencilAttachment, GL_TEXTURE_2D, desc.stencilAttachment.texture, 0);
} else if (desc.stencilAttachment.layer > 0) { } else if (desc.stencilAttachment.layer > 0) {
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, desc.stencilAttachment.texture, desc.stencilAttachment.mipLevel, desc.stencilAttachment.layer); glFramebufferTextureLayer(GL_FRAMEBUFFER, stencilAttachment, desc.stencilAttachment.texture, desc.stencilAttachment.mipLevel, desc.stencilAttachment.layer);
} else { } else {
glFramebufferTexture(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, desc.stencilAttachment.texture, desc.stencilAttachment.mipLevel); glFramebufferTexture(GL_FRAMEBUFFER, stencilAttachment, desc.stencilAttachment.texture, desc.stencilAttachment.mipLevel);
} }
} }
@@ -115,7 +117,7 @@ bool OpenGLFramebuffer::Initialize(class RHIRenderPass* renderPass, uint32_t wid
for (uint32_t i = 0; i < colorAttachmentCount && i < 16; ++i) { for (uint32_t i = 0; i < colorAttachmentCount && i < 16; ++i) {
if (colorAttachments[i]) { if (colorAttachments[i]) {
OpenGLResourceView* view = static_cast<OpenGLResourceView*>(colorAttachments[i]); OpenGLResourceView* view = static_cast<OpenGLResourceView*>(colorAttachments[i]);
GLenum glAttachment = GL_COLOR_ATTACHMENT0 + static_cast<GLenum>(i); GLenum glAttachment = ToOpenGLColorAttachment(i);
unsigned int texture = view->GetTexture(); unsigned int texture = view->GetTexture();
if (texture) { if (texture) {
glFramebufferTexture2D(GL_FRAMEBUFFER, glAttachment, GL_TEXTURE_2D, texture, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, glAttachment, GL_TEXTURE_2D, texture, 0);
@@ -128,7 +130,7 @@ bool OpenGLFramebuffer::Initialize(class RHIRenderPass* renderPass, uint32_t wid
OpenGLResourceView* view = static_cast<OpenGLResourceView*>(depthStencilAttachment); OpenGLResourceView* view = static_cast<OpenGLResourceView*>(depthStencilAttachment);
unsigned int texture = view->GetTexture(); unsigned int texture = view->GetTexture();
if (texture) { if (texture) {
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texture, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, ToOpenGLDepthStencilAttachment(), GL_TEXTURE_2D, texture, 0);
} }
} }

View File

@@ -1,5 +1,6 @@
#include "XCEngine/RHI/OpenGL/OpenGLPipelineState.h" #include "XCEngine/RHI/OpenGL/OpenGLPipelineState.h"
#include "XCEngine/RHI/OpenGL/OpenGLShader.h" #include "XCEngine/RHI/OpenGL/OpenGLShader.h"
#include "XCEngine/RHI/OpenGL/OpenGLEnums.h"
#include <glad/glad.h> #include <glad/glad.h>
namespace XCEngine { namespace XCEngine {
@@ -86,20 +87,20 @@ void OpenGLPipelineState::ApplyDepthStencil() {
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
} }
glDepthMask(m_glDepthStencilState.depthWriteEnable ? GL_TRUE : GL_FALSE); glDepthMask(m_glDepthStencilState.depthWriteEnable ? GL_TRUE : GL_FALSE);
glDepthFunc(static_cast<GLenum>(m_glDepthStencilState.depthFunc)); glDepthFunc(ToOpenGL(m_glDepthStencilState.depthFunc));
if (m_glDepthStencilState.stencilEnable) { if (m_glDepthStencilState.stencilEnable) {
glEnable(GL_STENCIL_TEST); glEnable(GL_STENCIL_TEST);
glStencilMask(m_glDepthStencilState.stencilWriteMask); glStencilMask(m_glDepthStencilState.stencilWriteMask);
glStencilFunc( glStencilFunc(
static_cast<GLenum>(m_glDepthStencilState.stencilFunc), ToOpenGL(m_glDepthStencilState.stencilFunc),
m_glDepthStencilState.stencilRef, m_glDepthStencilState.stencilRef,
m_glDepthStencilState.stencilReadMask m_glDepthStencilState.stencilReadMask
); );
glStencilOp( glStencilOp(
static_cast<GLenum>(m_glDepthStencilState.stencilFailOp), ToOpenGL(m_glDepthStencilState.stencilFailOp),
static_cast<GLenum>(m_glDepthStencilState.stencilDepthFailOp), ToOpenGL(m_glDepthStencilState.stencilDepthFailOp),
static_cast<GLenum>(m_glDepthStencilState.stencilDepthPassOp) ToOpenGL(m_glDepthStencilState.stencilDepthPassOp)
); );
} else { } else {
glDisable(GL_STENCIL_TEST); glDisable(GL_STENCIL_TEST);
@@ -110,14 +111,14 @@ void OpenGLPipelineState::ApplyBlend() {
if (m_glBlendState.blendEnable) { if (m_glBlendState.blendEnable) {
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFuncSeparate( glBlendFuncSeparate(
static_cast<GLenum>(m_glBlendState.srcBlend), ToOpenGL(m_glBlendState.srcBlend),
static_cast<GLenum>(m_glBlendState.dstBlend), ToOpenGL(m_glBlendState.dstBlend),
static_cast<GLenum>(m_glBlendState.srcBlendAlpha), ToOpenGL(m_glBlendState.srcBlendAlpha),
static_cast<GLenum>(m_glBlendState.dstBlendAlpha) ToOpenGL(m_glBlendState.dstBlendAlpha)
); );
glBlendEquationSeparate( glBlendEquationSeparate(
static_cast<GLenum>(m_glBlendState.blendOp), ToOpenGL(m_glBlendState.blendOp),
static_cast<GLenum>(m_glBlendState.blendOpAlpha) ToOpenGL(m_glBlendState.blendOpAlpha)
); );
glColorMask( glColorMask(
(m_glBlendState.colorWriteMask & 1) != 0, (m_glBlendState.colorWriteMask & 1) != 0,
@@ -133,13 +134,13 @@ void OpenGLPipelineState::ApplyBlend() {
void OpenGLPipelineState::ApplyRasterizer() { void OpenGLPipelineState::ApplyRasterizer() {
if (m_glRasterizerState.cullFaceEnable) { if (m_glRasterizerState.cullFaceEnable) {
glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
glCullFace(static_cast<GLenum>(m_glRasterizerState.cullFace)); glCullFace(ToOpenGL(m_glRasterizerState.cullFace));
glFrontFace(static_cast<GLenum>(m_glRasterizerState.frontFace)); glFrontFace(ToOpenGL(m_glRasterizerState.frontFace));
} else { } else {
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
} }
glPolygonMode(GL_FRONT_AND_BACK, static_cast<GLenum>(m_glRasterizerState.polygonMode)); glPolygonMode(GL_FRONT_AND_BACK, ToOpenGL(m_glRasterizerState.polygonMode));
if (m_glRasterizerState.multisampleEnable) { if (m_glRasterizerState.multisampleEnable) {
glEnable(GL_MULTISAMPLE); glEnable(GL_MULTISAMPLE);
@@ -197,11 +198,7 @@ void OpenGLPipelineState::SetClearColor(float r, float g, float b, float a) {
} }
void OpenGLPipelineState::Clear(unsigned int buffers) { void OpenGLPipelineState::Clear(unsigned int buffers) {
unsigned int glBuffers = 0; glClear(ToOpenGLClearBuffer(buffers));
if (buffers & 1) glBuffers |= GL_COLOR_BUFFER_BIT;
if (buffers & 2) glBuffers |= GL_DEPTH_BUFFER_BIT;
if (buffers & 4) glBuffers |= GL_STENCIL_BUFFER_BIT;
glClear(glBuffers);
} }
void OpenGLPipelineState::AttachShader(unsigned int program) { void OpenGLPipelineState::AttachShader(unsigned int program) {

View File

@@ -1,20 +1,10 @@
#include "XCEngine/RHI/OpenGL/OpenGLRenderTargetView.h" #include "XCEngine/RHI/OpenGL/OpenGLRenderTargetView.h"
#include "XCEngine/RHI/OpenGL/OpenGLEnums.h"
#include <glad/glad.h> #include <glad/glad.h>
namespace XCEngine { namespace XCEngine {
namespace RHI { namespace RHI {
static unsigned int ToGLRenderTargetType(RenderTargetType type) {
switch (type) {
case RenderTargetType::Texture2D: return GL_TEXTURE_2D;
case RenderTargetType::Texture2DArray: return GL_TEXTURE_2D_ARRAY;
case RenderTargetType::Texture3D: return GL_TEXTURE_3D;
case RenderTargetType::TextureCube: return GL_TEXTURE_CUBE_MAP;
case RenderTargetType::TextureCubeArray: return GL_TEXTURE_CUBE_MAP_ARRAY;
default: return GL_TEXTURE_2D;
}
}
OpenGLRenderTargetView::OpenGLRenderTargetView() OpenGLRenderTargetView::OpenGLRenderTargetView()
: m_texture(0) : m_texture(0)
, m_framebuffer(0) , m_framebuffer(0)
@@ -36,7 +26,7 @@ bool OpenGLRenderTargetView::Initialize(unsigned int texture, const OpenGLRender
glGenFramebuffers(1, &m_framebuffer); glGenFramebuffers(1, &m_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
unsigned int target = ToGLRenderTargetType(desc.type); unsigned int target = ToOpenGL(desc.type);
GLenum attachment = GL_COLOR_ATTACHMENT0; GLenum attachment = GL_COLOR_ATTACHMENT0;
switch (desc.type) { switch (desc.type) {

View File

@@ -1,31 +1,10 @@
#include "XCEngine/RHI/OpenGL/OpenGLSampler.h" #include "XCEngine/RHI/OpenGL/OpenGLSampler.h"
#include "XCEngine/RHI/OpenGL/OpenGLEnums.h"
#include <glad/glad.h> #include <glad/glad.h>
namespace XCEngine { namespace XCEngine {
namespace RHI { namespace RHI {
static unsigned int ToGLWrapMode(SamplerWrapMode mode) {
switch (mode) {
case SamplerWrapMode::Repeat: return GL_REPEAT;
case SamplerWrapMode::MirroredRepeat: return GL_MIRRORED_REPEAT;
case SamplerWrapMode::ClampToEdge: return GL_CLAMP_TO_EDGE;
case SamplerWrapMode::ClampToBorder: return GL_CLAMP_TO_BORDER;
default: return GL_REPEAT;
}
}
static unsigned int ToGLFilter(SamplerFilter filter) {
switch (filter) {
case SamplerFilter::Nearest: return GL_NEAREST;
case SamplerFilter::Linear: return GL_LINEAR;
case SamplerFilter::NearestMipmapNearest: return GL_NEAREST_MIPMAP_NEAREST;
case SamplerFilter::LinearMipmapNearest: return GL_LINEAR_MIPMAP_NEAREST;
case SamplerFilter::NearestMipmapLinear: return GL_NEAREST_MIPMAP_LINEAR;
case SamplerFilter::LinearMipmapLinear: return GL_LINEAR_MIPMAP_LINEAR;
default: return GL_LINEAR;
}
}
OpenGLSampler::OpenGLSampler() : m_sampler(0) { OpenGLSampler::OpenGLSampler() : m_sampler(0) {
} }
@@ -36,11 +15,11 @@ bool OpenGLSampler::Initialize(const OpenGLSamplerDesc& desc) {
m_desc = desc; m_desc = desc;
glGenSamplers(1, &m_sampler); glGenSamplers(1, &m_sampler);
glSamplerParameteri(m_sampler, GL_TEXTURE_MIN_FILTER, ToGLFilter(desc.minFilter)); glSamplerParameteri(m_sampler, GL_TEXTURE_MIN_FILTER, ToOpenGL(desc.minFilter));
glSamplerParameteri(m_sampler, GL_TEXTURE_MAG_FILTER, ToGLFilter(desc.magFilter)); glSamplerParameteri(m_sampler, GL_TEXTURE_MAG_FILTER, ToOpenGL(desc.magFilter));
glSamplerParameteri(m_sampler, GL_TEXTURE_WRAP_S, ToGLWrapMode(desc.wrapS)); glSamplerParameteri(m_sampler, GL_TEXTURE_WRAP_S, ToOpenGL(desc.wrapS));
glSamplerParameteri(m_sampler, GL_TEXTURE_WRAP_T, ToGLWrapMode(desc.wrapT)); glSamplerParameteri(m_sampler, GL_TEXTURE_WRAP_T, ToOpenGL(desc.wrapT));
glSamplerParameteri(m_sampler, GL_TEXTURE_WRAP_R, ToGLWrapMode(desc.wrapR)); glSamplerParameteri(m_sampler, GL_TEXTURE_WRAP_R, ToOpenGL(desc.wrapR));
glSamplerParameterf(m_sampler, GL_TEXTURE_MIN_LOD, desc.minLod); glSamplerParameterf(m_sampler, GL_TEXTURE_MIN_LOD, desc.minLod);
glSamplerParameterf(m_sampler, GL_TEXTURE_MAX_LOD, desc.maxLod); glSamplerParameterf(m_sampler, GL_TEXTURE_MAX_LOD, desc.maxLod);
glSamplerParameterf(m_sampler, GL_TEXTURE_MAX_ANISOTROPY, desc.maxAnisotropy); glSamplerParameterf(m_sampler, GL_TEXTURE_MAX_ANISOTROPY, desc.maxAnisotropy);

View File

@@ -61,5 +61,11 @@ bool OpenGLScreenshot::Capture(OpenGLDevice& device, OpenGLSwapChain& swapChain,
return true; return true;
} }
bool OpenGLScreenshot::Capture(RHIDevice* device, RHISwapChain* swapChain, const char* filename) {
auto* oglDevice = static_cast<OpenGLDevice*>(device);
auto* oglSwapChain = static_cast<OpenGLSwapChain*>(swapChain);
return Capture(*oglDevice, *oglSwapChain, filename);
}
} // namespace RHI } // namespace RHI
} // namespace XCEngine } // namespace XCEngine

View File

@@ -1,4 +1,5 @@
#include "XCEngine/RHI/OpenGL/OpenGLTexture.h" #include "XCEngine/RHI/OpenGL/OpenGLTexture.h"
#include "XCEngine/RHI/OpenGL/OpenGLEnums.h"
#include <glad/glad.h> #include <glad/glad.h>
#include <stb_image.h> #include <stb_image.h>
#include <iostream> #include <iostream>
@@ -6,47 +7,6 @@
namespace XCEngine { namespace XCEngine {
namespace RHI { namespace RHI {
static unsigned int ToGLTextureTarget(OpenGLTextureType type) {
switch (type) {
case OpenGLTextureType::Texture1D: return GL_TEXTURE_1D;
case OpenGLTextureType::Texture2D: return GL_TEXTURE_2D;
case OpenGLTextureType::Texture2DArray: return GL_TEXTURE_2D_ARRAY;
case OpenGLTextureType::Texture3D: return GL_TEXTURE_3D;
case OpenGLTextureType::TextureCube: return GL_TEXTURE_CUBE_MAP;
case OpenGLTextureType::TextureCubeArray: return GL_TEXTURE_CUBE_MAP_ARRAY;
default: return GL_TEXTURE_2D;
}
}
static void ToGLFormat(OpenGLFormat fmt, unsigned int& internalFormat, unsigned int& glFormat, unsigned int& glType) {
switch (fmt) {
case OpenGLFormat::R8:
internalFormat = GL_R8; glFormat = GL_RED; glType = GL_UNSIGNED_BYTE;
break;
case OpenGLFormat::RG8:
internalFormat = GL_RG8; glFormat = GL_RG; glType = GL_UNSIGNED_BYTE;
break;
case OpenGLFormat::RGBA8:
internalFormat = GL_RGBA8; glFormat = GL_RGBA; glType = GL_UNSIGNED_BYTE;
break;
case OpenGLFormat::RGBA16F:
internalFormat = GL_RGBA16F; glFormat = GL_RGBA; glType = GL_HALF_FLOAT;
break;
case OpenGLFormat::RGBA32F:
internalFormat = GL_RGBA32F; glFormat = GL_RGBA; glType = GL_FLOAT;
break;
case OpenGLFormat::Depth24Stencil8:
internalFormat = GL_DEPTH24_STENCIL8; glFormat = GL_DEPTH_STENCIL; glType = GL_UNSIGNED_INT_24_8;
break;
case OpenGLFormat::Depth32F:
internalFormat = GL_DEPTH_COMPONENT32F; glFormat = GL_DEPTH_COMPONENT; glType = GL_FLOAT;
break;
default:
internalFormat = GL_RGBA8; glFormat = GL_RGBA; glType = GL_UNSIGNED_BYTE;
break;
}
}
OpenGLTexture::OpenGLTexture() OpenGLTexture::OpenGLTexture()
: m_texture(0) : m_texture(0)
, m_type(OpenGLTextureType::Texture2D) , m_type(OpenGLTextureType::Texture2D)
@@ -68,9 +28,10 @@ bool OpenGLTexture::Initialize(OpenGLTextureType type, int width, int height, in
m_depth = depth; m_depth = depth;
m_mipLevels = mipLevels; m_mipLevels = mipLevels;
unsigned int target = ToGLTextureTarget(type); unsigned int target = ToOpenGL(type);
unsigned int internalFormat, glFormat, glType; GLint internalFormat;
ToGLFormat(format, internalFormat, glFormat, glType); GLenum glFormat, glType;
ToOpenGLFormat(format, internalFormat, glFormat, glType);
glGenTextures(1, &m_texture); glGenTextures(1, &m_texture);
glBindTexture(target, m_texture); glBindTexture(target, m_texture);
@@ -136,8 +97,9 @@ bool OpenGLTexture::InitializeCubeMap(int size, int mipLevels, OpenGLFormat form
m_depth = 1; m_depth = 1;
m_mipLevels = mipLevels; m_mipLevels = mipLevels;
unsigned int internalFormat, glFormat, glType; GLint internalFormat;
ToGLFormat(format, internalFormat, glFormat, glType); GLenum glFormat, glType;
ToOpenGLFormat(format, internalFormat, glFormat, glType);
glGenTextures(1, &m_texture); glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture); glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture);
@@ -178,31 +140,31 @@ void OpenGLTexture::Shutdown() {
} }
void OpenGLTexture::Bind(int slot) const { void OpenGLTexture::Bind(int slot) const {
unsigned int target = ToGLTextureTarget(m_type); unsigned int target = ToOpenGL(m_type);
glActiveTexture(GL_TEXTURE0 + slot); glActiveTexture(GL_TEXTURE0 + slot);
glBindTexture(target, m_texture); glBindTexture(target, m_texture);
} }
void OpenGLTexture::Unbind() const { void OpenGLTexture::Unbind() const {
unsigned int target = ToGLTextureTarget(m_type); unsigned int target = ToOpenGL(m_type);
glBindTexture(target, 0); glBindTexture(target, 0);
} }
void OpenGLTexture::BindImage(int slot, bool read, bool write) const { void OpenGLTexture::BindImage(int slot, bool read, bool write) const {
unsigned int target = ToGLTextureTarget(m_type); unsigned int target = ToOpenGL(m_type);
GLenum access = (read && write) ? GL_READ_WRITE : (read ? GL_READ_ONLY : GL_WRITE_ONLY); GLenum access = (read && write) ? GL_READ_WRITE : (read ? GL_READ_ONLY : GL_WRITE_ONLY);
glBindImageTexture(slot, m_texture, 0, GL_FALSE, 0, access, GL_RGBA8); glBindImageTexture(slot, m_texture, 0, GL_FALSE, 0, access, GL_RGBA8);
} }
void OpenGLTexture::GenerateMipmap() { void OpenGLTexture::GenerateMipmap() {
unsigned int target = ToGLTextureTarget(m_type); unsigned int target = ToOpenGL(m_type);
glBindTexture(target, m_texture); glBindTexture(target, m_texture);
glGenerateMipmap(target); glGenerateMipmap(target);
glBindTexture(target, 0); glBindTexture(target, 0);
} }
void OpenGLTexture::SetFiltering(int minFilter, int magFilter) { void OpenGLTexture::SetFiltering(int minFilter, int magFilter) {
unsigned int target = ToGLTextureTarget(m_type); unsigned int target = ToOpenGL(m_type);
glBindTexture(target, m_texture); glBindTexture(target, m_texture);
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, minFilter); glTexParameteri(target, GL_TEXTURE_MIN_FILTER, minFilter);
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, magFilter); glTexParameteri(target, GL_TEXTURE_MAG_FILTER, magFilter);
@@ -210,7 +172,7 @@ void OpenGLTexture::SetFiltering(int minFilter, int magFilter) {
} }
void OpenGLTexture::SetWrapping(int wrapS, int wrapT, int wrapR) { void OpenGLTexture::SetWrapping(int wrapS, int wrapT, int wrapR) {
unsigned int target = ToGLTextureTarget(m_type); unsigned int target = ToOpenGL(m_type);
glBindTexture(target, m_texture); glBindTexture(target, m_texture);
glTexParameteri(target, GL_TEXTURE_WRAP_S, wrapS); glTexParameteri(target, GL_TEXTURE_WRAP_S, wrapS);
glTexParameteri(target, GL_TEXTURE_WRAP_T, wrapT); glTexParameteri(target, GL_TEXTURE_WRAP_T, wrapT);

View File

@@ -1,28 +1,10 @@
#include "XCEngine/RHI/OpenGL/OpenGLVertexArray.h" #include "XCEngine/RHI/OpenGL/OpenGLVertexArray.h"
#include "XCEngine/RHI/OpenGL/OpenGLEnums.h"
#include <glad/glad.h> #include <glad/glad.h>
namespace XCEngine { namespace XCEngine {
namespace RHI { namespace RHI {
static unsigned int ToGLAttributeType(VertexAttributeType type) {
switch (type) {
case VertexAttributeType::Float: return GL_FLOAT;
case VertexAttributeType::Int: return GL_INT;
case VertexAttributeType::UnsignedInt: return GL_UNSIGNED_INT;
case VertexAttributeType::Short: return GL_SHORT;
case VertexAttributeType::UnsignedShort: return GL_UNSIGNED_SHORT;
case VertexAttributeType::Byte: return GL_BYTE;
case VertexAttributeType::UnsignedByte: return GL_UNSIGNED_BYTE;
case VertexAttributeType::Double: return GL_DOUBLE;
case VertexAttributeType::HalfFloat: return GL_HALF_FLOAT;
case VertexAttributeType::Fixed: return GL_FIXED;
case VertexAttributeType::Int2101010Rev: return GL_INT_2_10_10_10_REV;
case VertexAttributeType::UnsignedInt2101010Rev: return GL_UNSIGNED_INT_2_10_10_10_REV;
case VertexAttributeType::UnsignedInt10F11F11FRev: return GL_UNSIGNED_INT_10F_11F_11F_REV;
default: return GL_FLOAT;
}
}
OpenGLVertexArray::OpenGLVertexArray() OpenGLVertexArray::OpenGLVertexArray()
: m_vao(0) : m_vao(0)
, m_indexBuffer(0) , m_indexBuffer(0)
@@ -44,7 +26,7 @@ void OpenGLVertexArray::AddVertexBuffer(unsigned int buffer, const VertexAttribu
glBindBuffer(GL_ARRAY_BUFFER, buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer);
glEnableVertexAttribArray(attribute.index); glEnableVertexAttribArray(attribute.index);
glVertexAttribPointer(attribute.index, attribute.count, glVertexAttribPointer(attribute.index, attribute.count,
ToGLAttributeType(attribute.type), ToOpenGL(attribute.type),
attribute.normalized == VertexAttributeNormalized::True ? GL_TRUE : GL_FALSE, attribute.normalized == VertexAttributeNormalized::True ? GL_TRUE : GL_FALSE,
attribute.stride, (void*)attribute.offset); attribute.stride, (void*)attribute.offset);
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);