Code refactor: move more memory allocation logic into device API.
* Remove tex_* and pixels_* functions, replace by mem_*. * Add MEM_TEXTURE and MEM_PIXELS as memory types recognized by devices. * No longer create device_memory and call mem_* directly, always go through device_only_memory, device_vector and device_pixels.
This commit is contained in:
@@ -172,36 +172,6 @@ public:
|
||||
snd.write_buffer(host, size);
|
||||
}
|
||||
|
||||
void tex_alloc(device_memory& mem)
|
||||
{
|
||||
VLOG(1) << "Texture allocate: " << mem.name << ", "
|
||||
<< string_human_readable_number(mem.memory_size()) << " bytes. ("
|
||||
<< string_human_readable_size(mem.memory_size()) << ")";
|
||||
|
||||
thread_scoped_lock lock(rpc_lock);
|
||||
|
||||
mem.device_pointer = ++mem_counter;
|
||||
|
||||
RPCSend snd(socket, &error_func, "tex_alloc");
|
||||
snd.add(mem);
|
||||
snd.write();
|
||||
snd.write_buffer((void*)mem.data_pointer, mem.memory_size());
|
||||
}
|
||||
|
||||
void tex_free(device_memory& mem)
|
||||
{
|
||||
if(mem.device_pointer) {
|
||||
thread_scoped_lock lock(rpc_lock);
|
||||
|
||||
RPCSend snd(socket, &error_func, "tex_free");
|
||||
|
||||
snd.add(mem);
|
||||
snd.write();
|
||||
|
||||
mem.device_pointer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool load_kernels(const DeviceRequestedFeatures& requested_features)
|
||||
{
|
||||
if(error_func.have_error())
|
||||
@@ -310,7 +280,7 @@ public:
|
||||
snd.write();
|
||||
}
|
||||
|
||||
int get_split_task_count(DeviceTask& task)
|
||||
int get_split_task_count(DeviceTask&)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
@@ -464,21 +434,17 @@ protected:
|
||||
rcv.read(mem, name);
|
||||
lock.unlock();
|
||||
|
||||
/* Allocate host side data buffer. */
|
||||
size_t data_size = mem.memory_size();
|
||||
device_ptr client_pointer = mem.device_pointer;
|
||||
|
||||
/* create a memory buffer for the device buffer */
|
||||
size_t data_size = mem.memory_size();
|
||||
DataVector &data_v = data_vector_insert(client_pointer, data_size);
|
||||
mem.data_pointer = (data_size)? (device_ptr)&(data_v[0]): 0;
|
||||
|
||||
if(data_size)
|
||||
mem.data_pointer = (device_ptr)&(data_v[0]);
|
||||
else
|
||||
mem.data_pointer = 0;
|
||||
|
||||
/* perform the allocation on the actual device */
|
||||
/* Perform the allocation on the actual device. */
|
||||
device->mem_alloc(mem);
|
||||
|
||||
/* store a mapping to/from client_pointer and real device pointer */
|
||||
/* Store a mapping to/from client_pointer and real device pointer. */
|
||||
pointer_mapping_insert(client_pointer, mem.device_pointer);
|
||||
}
|
||||
else if(rcv.name == "mem_copy_to") {
|
||||
@@ -487,23 +453,33 @@ protected:
|
||||
rcv.read(mem, name);
|
||||
lock.unlock();
|
||||
|
||||
size_t data_size = mem.memory_size();
|
||||
device_ptr client_pointer = mem.device_pointer;
|
||||
|
||||
DataVector &data_v = data_vector_find(client_pointer);
|
||||
if(client_pointer) {
|
||||
/* Lookup existing host side data buffer. */
|
||||
DataVector &data_v = data_vector_find(client_pointer);
|
||||
mem.data_pointer = (device_ptr)&data_v[0];
|
||||
|
||||
size_t data_size = mem.memory_size();
|
||||
/* Translate the client pointer to a real device pointer. */
|
||||
mem.device_pointer = device_ptr_from_client_pointer(client_pointer);
|
||||
}
|
||||
else {
|
||||
/* Allocate host side data buffer. */
|
||||
DataVector &data_v = data_vector_insert(client_pointer, data_size);
|
||||
mem.data_pointer = (data_size)? (device_ptr)&(data_v[0]): 0;
|
||||
}
|
||||
|
||||
/* get pointer to memory buffer for device buffer */
|
||||
mem.data_pointer = (device_ptr)&data_v[0];
|
||||
|
||||
/* copy data from network into memory buffer */
|
||||
/* Copy data from network into memory buffer. */
|
||||
rcv.read_buffer((uint8_t*)mem.data_pointer, data_size);
|
||||
|
||||
/* translate the client pointer to a real device pointer */
|
||||
mem.device_pointer = device_ptr_from_client_pointer(client_pointer);
|
||||
|
||||
/* copy the data from the memory buffer to the device buffer */
|
||||
/* Copy the data from the memory buffer to the device buffer. */
|
||||
device->mem_copy_to(mem);
|
||||
|
||||
if(!client_pointer) {
|
||||
/* Store a mapping to/from client_pointer and real device pointer. */
|
||||
pointer_mapping_insert(client_pointer, mem.device_pointer);
|
||||
}
|
||||
}
|
||||
else if(rcv.name == "mem_copy_from") {
|
||||
string name;
|
||||
@@ -538,14 +514,30 @@ protected:
|
||||
rcv.read(mem, name);
|
||||
lock.unlock();
|
||||
|
||||
size_t data_size = mem.memory_size();
|
||||
device_ptr client_pointer = mem.device_pointer;
|
||||
mem.device_pointer = device_ptr_from_client_pointer(client_pointer);
|
||||
|
||||
DataVector &data_v = data_vector_find(client_pointer);
|
||||
if(client_pointer) {
|
||||
/* Lookup existing host side data buffer. */
|
||||
DataVector &data_v = data_vector_find(client_pointer);
|
||||
mem.data_pointer = (device_ptr)&data_v[0];
|
||||
|
||||
mem.data_pointer = (device_ptr)&(data_v[0]);
|
||||
/* Translate the client pointer to a real device pointer. */
|
||||
mem.device_pointer = device_ptr_from_client_pointer(client_pointer);
|
||||
}
|
||||
else {
|
||||
/* Allocate host side data buffer. */
|
||||
DataVector &data_v = data_vector_insert(client_pointer, data_size);
|
||||
mem.data_pointer = (data_size)? (device_ptr)&(data_v[0]): 0;
|
||||
}
|
||||
|
||||
/* Zero memory. */
|
||||
device->mem_zero(mem);
|
||||
|
||||
if(!client_pointer) {
|
||||
/* Store a mapping to/from client_pointer and real device pointer. */
|
||||
pointer_mapping_insert(client_pointer, mem.device_pointer);
|
||||
}
|
||||
}
|
||||
else if(rcv.name == "mem_free") {
|
||||
string name;
|
||||
@@ -573,45 +565,6 @@ protected:
|
||||
|
||||
device->const_copy_to(name_string.c_str(), &host_vector[0], size);
|
||||
}
|
||||
else if(rcv.name == "tex_alloc") {
|
||||
string name;
|
||||
network_device_memory mem(device);
|
||||
device_ptr client_pointer;
|
||||
|
||||
rcv.read(mem, name);
|
||||
lock.unlock();
|
||||
|
||||
client_pointer = mem.device_pointer;
|
||||
|
||||
size_t data_size = mem.memory_size();
|
||||
|
||||
DataVector &data_v = data_vector_insert(client_pointer, data_size);
|
||||
|
||||
if(data_size)
|
||||
mem.data_pointer = (device_ptr)&(data_v[0]);
|
||||
else
|
||||
mem.data_pointer = 0;
|
||||
|
||||
rcv.read_buffer((uint8_t*)mem.data_pointer, data_size);
|
||||
|
||||
device->tex_alloc(mem);
|
||||
|
||||
pointer_mapping_insert(client_pointer, mem.device_pointer);
|
||||
}
|
||||
else if(rcv.name == "tex_free") {
|
||||
string name;
|
||||
network_device_memory mem(device);
|
||||
device_ptr client_pointer;
|
||||
|
||||
rcv.read(mem, name);
|
||||
lock.unlock();
|
||||
|
||||
client_pointer = mem.device_pointer;
|
||||
|
||||
mem.device_pointer = device_ptr_from_client_pointer_erase(client_pointer);
|
||||
|
||||
device->tex_free(mem);
|
||||
}
|
||||
else if(rcv.name == "load_kernels") {
|
||||
DeviceRequestedFeatures requested_features;
|
||||
rcv.read(requested_features.experimental);
|
||||
@@ -696,7 +649,7 @@ protected:
|
||||
}
|
||||
}
|
||||
|
||||
bool task_acquire_tile(Device *device, RenderTile& tile)
|
||||
bool task_acquire_tile(Device *, RenderTile& tile)
|
||||
{
|
||||
thread_scoped_lock acquire_lock(acquire_mutex);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user