core/command_queue_mt: Customizable size
Partial backport of 9f654b4
to 3.2
This commit is contained in:
parent
037571d08e
commit
074a098df6
|
@ -31,6 +31,7 @@
|
||||||
#include "command_queue_mt.h"
|
#include "command_queue_mt.h"
|
||||||
|
|
||||||
#include "core/os/os.h"
|
#include "core/os/os.h"
|
||||||
|
#include "core/project_settings.h"
|
||||||
|
|
||||||
void CommandQueueMT::lock() {
|
void CommandQueueMT::lock() {
|
||||||
|
|
||||||
|
@ -107,17 +108,22 @@ CommandQueueMT::CommandQueueMT(bool p_sync) {
|
||||||
write_ptr = 0;
|
write_ptr = 0;
|
||||||
dealloc_ptr = 0;
|
dealloc_ptr = 0;
|
||||||
mutex = Mutex::create();
|
mutex = Mutex::create();
|
||||||
command_mem = (uint8_t *)memalloc(COMMAND_MEM_SIZE);
|
|
||||||
|
command_mem_size = GLOBAL_DEF_RST("memory/limits/command_queue/multithreading_queue_size_kb", DEFAULT_COMMAND_MEM_SIZE_KB);
|
||||||
|
ProjectSettings::get_singleton()->set_custom_property_info("memory/limits/command_queue/multithreading_queue_size_kb", PropertyInfo(Variant::INT, "memory/limits/command_queue/multithreading_queue_size_kb", PROPERTY_HINT_RANGE, "1,4096,1,or_greater"));
|
||||||
|
command_mem_size *= 1024;
|
||||||
|
command_mem = (uint8_t *)memalloc(command_mem_size);
|
||||||
|
|
||||||
for (int i = 0; i < SYNC_SEMAPHORES; i++) {
|
for (int i = 0; i < SYNC_SEMAPHORES; i++) {
|
||||||
|
|
||||||
sync_sems[i].sem = Semaphore::create();
|
sync_sems[i].sem = Semaphore::create();
|
||||||
sync_sems[i].in_use = false;
|
sync_sems[i].in_use = false;
|
||||||
}
|
}
|
||||||
if (p_sync)
|
if (p_sync) {
|
||||||
sync = Semaphore::create();
|
sync = Semaphore::create();
|
||||||
else
|
} else {
|
||||||
sync = NULL;
|
sync = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CommandQueueMT::~CommandQueueMT() {
|
CommandQueueMT::~CommandQueueMT() {
|
||||||
|
|
|
@ -311,8 +311,7 @@ class CommandQueueMT {
|
||||||
/***** BASE *******/
|
/***** BASE *******/
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
COMMAND_MEM_SIZE_KB = 256,
|
DEFAULT_COMMAND_MEM_SIZE_KB = 256,
|
||||||
COMMAND_MEM_SIZE = COMMAND_MEM_SIZE_KB * 1024,
|
|
||||||
SYNC_SEMAPHORES = 8
|
SYNC_SEMAPHORES = 8
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -320,6 +319,7 @@ class CommandQueueMT {
|
||||||
uint32_t read_ptr;
|
uint32_t read_ptr;
|
||||||
uint32_t write_ptr;
|
uint32_t write_ptr;
|
||||||
uint32_t dealloc_ptr;
|
uint32_t dealloc_ptr;
|
||||||
|
uint32_t command_mem_size;
|
||||||
SyncSemaphore sync_sems[SYNC_SEMAPHORES];
|
SyncSemaphore sync_sems[SYNC_SEMAPHORES];
|
||||||
Mutex *mutex;
|
Mutex *mutex;
|
||||||
Semaphore *sync;
|
Semaphore *sync;
|
||||||
|
@ -345,7 +345,7 @@ class CommandQueueMT {
|
||||||
} else {
|
} else {
|
||||||
// ahead of dealloc_ptr, check that there is room
|
// ahead of dealloc_ptr, check that there is room
|
||||||
|
|
||||||
if ((COMMAND_MEM_SIZE - write_ptr) < alloc_size + sizeof(uint32_t)) {
|
if ((command_mem_size - write_ptr) < alloc_size + sizeof(uint32_t)) {
|
||||||
// no room at the end, wrap down;
|
// no room at the end, wrap down;
|
||||||
|
|
||||||
if (dealloc_ptr == 0) { // don't want write_ptr to become dealloc_ptr
|
if (dealloc_ptr == 0) { // don't want write_ptr to become dealloc_ptr
|
||||||
|
@ -358,7 +358,7 @@ class CommandQueueMT {
|
||||||
}
|
}
|
||||||
|
|
||||||
// if this happens, it's a bug
|
// if this happens, it's a bug
|
||||||
ERR_FAIL_COND_V((COMMAND_MEM_SIZE - write_ptr) < 8, NULL);
|
ERR_FAIL_COND_V((command_mem_size - write_ptr) < 8, NULL);
|
||||||
// zero means, wrap to beginning
|
// zero means, wrap to beginning
|
||||||
|
|
||||||
uint32_t *p = (uint32_t *)&command_mem[write_ptr];
|
uint32_t *p = (uint32_t *)&command_mem[write_ptr];
|
||||||
|
|
Loading…
Reference in New Issue