Add RHI vertex and index buffer views

This commit is contained in:
2026-03-25 23:07:22 +08:00
parent 268daf7bc9
commit aaf9cce418
14 changed files with 342 additions and 19 deletions

View File

@@ -21,7 +21,10 @@ OpenGLResourceView::OpenGLResourceView()
, m_buffer(nullptr)
, m_framebuffer(nullptr)
, m_textureUnitAllocator(nullptr)
, m_uniformBufferManager(nullptr) {
, m_uniformBufferManager(nullptr)
, m_bufferOffset(0)
, m_bufferSize(0)
, m_bufferStride(0) {
}
OpenGLResourceView::~OpenGLResourceView() {
@@ -47,10 +50,16 @@ void OpenGLResourceView::Shutdown() {
m_framebufferID = 0;
m_texture = nullptr;
m_buffer = nullptr;
m_bufferOffset = 0;
m_bufferSize = 0;
m_bufferStride = 0;
}
void* OpenGLResourceView::GetNativeHandle() {
switch (m_viewType) {
case ResourceViewType::VertexBuffer:
case ResourceViewType::IndexBuffer:
return reinterpret_cast<void*>(static_cast<uintptr_t>(m_buffer ? m_buffer->GetID() : 0));
case ResourceViewType::RenderTarget:
case ResourceViewType::DepthStencil:
return reinterpret_cast<void*>(static_cast<uintptr_t>(m_framebufferID));
@@ -66,6 +75,9 @@ void* OpenGLResourceView::GetNativeHandle() {
bool OpenGLResourceView::IsValid() const {
switch (m_viewType) {
case ResourceViewType::VertexBuffer:
case ResourceViewType::IndexBuffer:
return m_buffer != nullptr && m_buffer->GetID() != 0;
case ResourceViewType::RenderTarget:
case ResourceViewType::DepthStencil:
return m_framebufferID != 0;
@@ -186,6 +198,40 @@ bool OpenGLResourceView::InitializeAsConstantBuffer(
return true;
}
bool OpenGLResourceView::InitializeAsVertexBuffer(
OpenGLBuffer* buffer,
const ResourceViewDesc& desc) {
if (!buffer) {
return false;
}
m_viewType = ResourceViewType::VertexBuffer;
m_format = Format::Unknown;
m_dimension = ResourceViewDimension::Buffer;
m_buffer = buffer;
m_bufferOffset = desc.bufferLocation;
m_bufferSize = static_cast<uint32_t>(buffer->GetSize());
m_bufferStride = desc.structureByteStride > 0 ? desc.structureByteStride : buffer->GetStride();
return true;
}
bool OpenGLResourceView::InitializeAsIndexBuffer(
OpenGLBuffer* buffer,
const ResourceViewDesc& desc) {
if (!buffer) {
return false;
}
m_viewType = ResourceViewType::IndexBuffer;
m_format = desc.format != 0 ? static_cast<Format>(desc.format) : Format::R32_UInt;
m_dimension = ResourceViewDimension::Buffer;
m_buffer = buffer;
m_bufferOffset = desc.bufferLocation;
m_bufferSize = static_cast<uint32_t>(buffer->GetSize());
m_bufferStride = buffer->GetStride();
return true;
}
unsigned int OpenGLResourceView::GetFramebuffer() const {
return m_framebuffer ? m_framebuffer->GetFramebuffer() : 0;
}
@@ -199,4 +245,4 @@ unsigned int OpenGLResourceView::GetBuffer() const {
}
} // namespace RHI
} // namespace XCEngine
} // namespace XCEngine