[D3D12] CP: Framework for multiple command lists per frame
This commit is contained in:
@@ -112,7 +112,7 @@ bool PrimitiveConverter::Initialize() {
|
||||
}
|
||||
static_ib_upload_->Unmap(0, nullptr);
|
||||
// Not uploaded yet.
|
||||
static_ib_upload_fence_value_ = UINT64_MAX;
|
||||
static_ib_upload_submission_ = UINT64_MAX;
|
||||
if (FAILED(device->CreateCommittedResource(
|
||||
&ui::d3d12::util::kHeapPropertiesDefault, D3D12_HEAP_FLAG_NONE,
|
||||
&static_ib_desc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr,
|
||||
@@ -145,29 +145,26 @@ void PrimitiveConverter::ClearCache() { buffer_pool_->ClearCache(); }
|
||||
void PrimitiveConverter::BeginSubmission() {
|
||||
// Got a command list now - upload and transition the static index buffer if
|
||||
// needed.
|
||||
if (static_ib_upload_ && static_ib_upload_fence_value_ == UINT64_MAX) {
|
||||
// Not uploaded yet - upload.
|
||||
command_processor_->GetDeferredCommandList()->D3DCopyResource(
|
||||
static_ib_, static_ib_upload_);
|
||||
command_processor_->PushTransitionBarrier(
|
||||
static_ib_, D3D12_RESOURCE_STATE_COPY_DEST,
|
||||
D3D12_RESOURCE_STATE_INDEX_BUFFER);
|
||||
static_ib_upload_fence_value_ = command_processor_->GetCurrentFenceValue();
|
||||
if (static_ib_upload_) {
|
||||
if (static_ib_upload_submission_ == UINT64_MAX) {
|
||||
// Not uploaded yet - upload.
|
||||
command_processor_->GetDeferredCommandList()->D3DCopyResource(
|
||||
static_ib_, static_ib_upload_);
|
||||
command_processor_->PushTransitionBarrier(
|
||||
static_ib_, D3D12_RESOURCE_STATE_COPY_DEST,
|
||||
D3D12_RESOURCE_STATE_INDEX_BUFFER);
|
||||
static_ib_upload_submission_ = command_processor_->GetCurrentSubmission();
|
||||
} else if (command_processor_->GetCompletedSubmission() >=
|
||||
static_ib_upload_submission_) {
|
||||
// Completely uploaded - release the upload buffer.
|
||||
static_ib_upload_->Release();
|
||||
static_ib_upload_ = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PrimitiveConverter::BeginFrame() {
|
||||
uint64_t completed_fence_value = command_processor_->GetCompletedFenceValue();
|
||||
|
||||
if (static_ib_upload_ && static_ib_upload_fence_value_ != UINT64_MAX &&
|
||||
completed_fence_value >= static_ib_upload_fence_value_) {
|
||||
// Completely uploaded - release the upload buffer.
|
||||
static_ib_upload_->Release();
|
||||
static_ib_upload_ = nullptr;
|
||||
}
|
||||
|
||||
buffer_pool_->Reclaim(command_processor_->GetCompletedFenceValue());
|
||||
|
||||
buffer_pool_->Reclaim(command_processor_->GetCompletedFrame());
|
||||
converted_indices_cache_.clear();
|
||||
memory_regions_used_ = 0;
|
||||
}
|
||||
@@ -698,7 +695,7 @@ void* PrimitiveConverter::AllocateIndices(
|
||||
}
|
||||
D3D12_GPU_VIRTUAL_ADDRESS gpu_address;
|
||||
uint8_t* mapping =
|
||||
buffer_pool_->Request(command_processor_->GetCurrentFenceValue(), size,
|
||||
buffer_pool_->Request(command_processor_->GetCurrentFrame(), size,
|
||||
nullptr, nullptr, &gpu_address);
|
||||
if (mapping == nullptr) {
|
||||
XELOGE("Failed to allocate space for %u converted %u-bit vertex indices",
|
||||
|
||||
Reference in New Issue
Block a user