P4 to Git Change 1544622 by gandryey@gera-w8 on 2018/04/20 17:02:52

SWDEV-79445 - OCL generic changes and code clean-up
	- Add managed buffer support and replace all uploads with the managed buffer allocations
	- Add staging copy for small image writes
	- Replace constant buffer in FillBuffer with a managed buffer also

Affected files ...

... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palblit.cpp#20 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palblit.hpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palconstbuf.cpp#8 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palconstbuf.hpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.cpp#84 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.hpp#26 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprogram.cpp#62 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palresource.cpp#63 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.cpp#92 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.hpp#48 edit
This commit is contained in:
foreman
2018-04-20 17:08:29 -04:00
parent b5ee2e3b84
commit 392724cc3f
10 changed files with 175 additions and 148 deletions
+54 -5
View File
@@ -19,7 +19,7 @@ ManagedBuffer::ManagedBuffer(VirtualGPU& gpu, uint32_t size)
, wrtAddress_(nullptr) {}
// ================================================================================================
ManagedBuffer::~ManagedBuffer() {
void ManagedBuffer::release() {
for (auto it : buffers_) {
if (it->data() != nullptr) {
it->unmap(&gpu_);
@@ -72,13 +72,26 @@ address ManagedBuffer::reserve(uint32_t size, uint64_t* gpu_address) {
*gpu_address = buffers_[activeBuffer_]->vmAddress() + wrtOffset_;
address cpu_address = wrtAddress_ + wrtOffset_;
// Adjust the offset by the reserved size
wrtOffset_ += count;
return cpu_address;
}
// ================================================================================================
Memory& ManagedBuffer::reserveAtTheTop(uint32_t size)
{
// Get the next buffer in the list
++activeBuffer_;
activeBuffer_ %= MaxNumberOfBuffers;
// Make sure the buffer isn't busy
buffers_[activeBuffer_]->wait(gpu_);
wrtAddress_ = buffers_[activeBuffer_]->data();
wrtOffset_ = 0;
return *buffers_[activeBuffer_];
}
// ================================================================================================
ConstantBuffer::ConstantBuffer(ManagedBuffer& mbuf, uint32_t size)
: mbuf_(mbuf)
@@ -114,11 +127,47 @@ uint64_t ConstantBuffer::UploadDataToHw(uint32_t size) const {
// ================================================================================================
uint64_t ConstantBuffer::UploadDataToHw(const void* sysmem, uint32_t size) const {
uint64_t vm_address;
address cpu_address = mbuf_.reserve(size, &vm_address);
// Update memory with new CB data
memcpy(cpu_address, sysmem, size);
return vm_address;
}
// ================================================================================================
XferBuffer::XferBuffer(ManagedBuffer& mbuf, uint32_t size)
: mbuf_(mbuf)
, size_(size)
{}
// ================================================================================================
Memory& XferBuffer::Acquire(uint32_t size) const
{
uint64_t vm_address;
// Reserve space in the managed buffer
address cpu_address = mbuf_.reserve(size, &vm_address);
// Update memory with new CB data
memcpy(cpu_address, sysmem, size);
return vm_address;
// Create a view for access
Memory* mem = new Memory(mbuf_.gpu().dev(), static_cast<size_t>(size));
Resource::ViewParams params = {};
params.gpu_ = &mbuf_.gpu();
params.offset_ = vm_address - mbuf_.vmAddress();
params.size_ = size;
params.resource_ = mbuf_.activeMemory();
if (nullptr == mem || !mem->create(Resource::View, &params)) {
delete mem;
// If the suballocaiton failed for some reason, then return the top of the active buffer
return mbuf_.reserveAtTheTop(size);
}
return *mem;
}
// ================================================================================================
void XferBuffer::Release(Memory& mem) const
{
// Delete view
if (mem.desc().type_ == Resource::View) {
delete &mem;
}
}
} // namespace pal