refactor: Clean up RHI interface and implement descriptor set pooling
- Remove unnecessary inline keywords from RHICommandList - Add TextureType enum for proper texture type classification - Update DescriptorSet API to support binding with pipeline layout - Simplify D3D12CommandList implementation - Implement descriptor set binding with pipeline layout for both D3D12 and OpenGL
This commit is contained in:
@@ -32,7 +32,7 @@ bool OpenGLDescriptorSet::Initialize(OpenGLTextureUnitAllocator* allocator, uint
|
||||
m_bindings.resize(layout.bindingCount);
|
||||
for (uint32_t i = 0; i < layout.bindingCount; ++i) {
|
||||
m_bindings[i].binding = layout.bindings[i].binding;
|
||||
m_bindings[i].type = layout.bindings[i].type;
|
||||
m_bindings[i].type = static_cast<DescriptorType>(layout.bindings[i].type);
|
||||
m_bindings[i].count = layout.bindings[i].count;
|
||||
m_bindings[i].textureUnits.resize(layout.bindings[i].count);
|
||||
m_bindings[i].textureIds.resize(layout.bindings[i].count, 0);
|
||||
@@ -52,6 +52,11 @@ bool OpenGLDescriptorSet::Initialize(OpenGLTextureUnitAllocator* allocator, uint
|
||||
}
|
||||
|
||||
void OpenGLDescriptorSet::Shutdown() {
|
||||
if (m_constantBuffer != 0) {
|
||||
glDeleteBuffers(1, reinterpret_cast<GLuint*>(&m_constantBuffer));
|
||||
m_constantBuffer = 0;
|
||||
}
|
||||
|
||||
if (m_allocator != nullptr) {
|
||||
for (auto& binding : m_bindings) {
|
||||
for (uint32_t i = 0; i < binding.textureUnits.size(); ++i) {
|
||||
@@ -107,9 +112,19 @@ void OpenGLDescriptorSet::UpdateSampler(uint32_t offset, RHISampler* sampler) {
|
||||
}
|
||||
|
||||
void OpenGLDescriptorSet::Bind() {
|
||||
if (m_constantBufferDirty && !m_constantBufferData.empty()) {
|
||||
if (m_constantBuffer == 0) {
|
||||
glGenBuffers(1, reinterpret_cast<GLuint*>(&m_constantBuffer));
|
||||
}
|
||||
glBindBuffer(GL_UNIFORM_BUFFER, m_constantBuffer);
|
||||
glBufferData(GL_UNIFORM_BUFFER, m_constantBufferData.size(), m_constantBufferData.data(), GL_DYNAMIC_DRAW);
|
||||
glBindBufferBase(GL_UNIFORM_BUFFER, 0, m_constantBuffer);
|
||||
m_constantBufferDirty = false;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < m_bindings.size(); ++i) {
|
||||
const auto& binding = m_bindings[i];
|
||||
|
||||
|
||||
for (size_t j = 0; j < binding.textureUnits.size(); ++j) {
|
||||
uint32_t unit = binding.textureUnits[j];
|
||||
uint32_t textureId = binding.textureIds[j];
|
||||
@@ -133,6 +148,22 @@ void OpenGLDescriptorSet::Bind() {
|
||||
m_bound = true;
|
||||
}
|
||||
|
||||
void OpenGLDescriptorSet::Unbind() {
|
||||
for (size_t i = 0; i < m_bindings.size(); ++i) {
|
||||
const auto& binding = m_bindings[i];
|
||||
|
||||
for (size_t j = 0; j < binding.textureUnits.size(); ++j) {
|
||||
uint32_t unit = binding.textureUnits[j];
|
||||
|
||||
glActiveTexture(GL_TEXTURE0 + unit);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glBindSampler(unit, 0);
|
||||
}
|
||||
}
|
||||
|
||||
m_bound = false;
|
||||
}
|
||||
|
||||
uint32_t OpenGLDescriptorSet::GetBindingPoint(uint32_t binding) const {
|
||||
for (size_t i = 0; i < m_bindings.size(); ++i) {
|
||||
if (m_bindings[i].binding == binding && !m_bindings[i].textureUnits.empty()) {
|
||||
@@ -142,5 +173,14 @@ uint32_t OpenGLDescriptorSet::GetBindingPoint(uint32_t binding) const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void OpenGLDescriptorSet::WriteConstant(uint32_t binding, const void* data, size_t size, size_t offset) {
|
||||
size_t requiredSize = offset + size;
|
||||
if (m_constantBufferData.size() < requiredSize) {
|
||||
m_constantBufferData.resize(requiredSize);
|
||||
}
|
||||
memcpy(m_constantBufferData.data() + offset, data, size);
|
||||
m_constantBufferDirty = true;
|
||||
}
|
||||
|
||||
} // namespace RHI
|
||||
} // namespace XCEngine
|
||||
Reference in New Issue
Block a user