已开启
解决黎明觉醒游戏 vulkan驱动崩溃问题 #13
maoyue0730创建于 2025年12月18日
解决黎明觉醒游戏 vulkan驱动崩溃问题 #13
已开启
共 2 个文件变更+744-456
| @@ -36,6 +36,8 @@ | |||
| 36 | extern "C" { | 36 | extern "C" { |
| 37 | 37 | ||
| 38 | 38 | ||
| 39 | +static unsigned util_dynarray_is_data_stack_allocated; | ||
| 40 | + | ||
| 39 | /* A zero-initialized version of this is guaranteed to represent an | 41 | /* A zero-initialized version of this is guaranteed to represent an |
| 40 | * empty array. | 42 | * empty array. |
| 41 | * | 43 | * |
| @@ -57,11 +59,21 @@ util_dynarray_init(struct util_dynarray *buf, void *mem_ctx) | |||
| 57 | buf->mem_ctx = mem_ctx; | 59 | buf->mem_ctx = mem_ctx; |
| 58 | } | 60 | } |
| 59 | 61 | ||
| 62 | +static inline void | ||
| 63 | +util_dynarray_init_from_stack(struct util_dynarray *buf, void *data, unsigned capacity) | ||
| 64 | +{ | ||
| 65 | + memset(buf, 0, sizeof(*buf)); | ||
| 66 | + buf->mem_ctx = &util_dynarray_is_data_stack_allocated; | ||
| 67 | + buf->data = data; | ||
| 68 | + buf->capacity = capacity; | ||
| 69 | +} | ||
| 70 | + | ||
| 60 | static inline void | 71 | static inline void |
| 61 | util_dynarray_fini(struct util_dynarray *buf) | 72 | util_dynarray_fini(struct util_dynarray *buf) |
| 62 | { | 73 | { |
| 63 | if (buf->data) { | 74 | if (buf->data) { |
| 64 | - if (buf->mem_ctx) { | 75 | + if (buf->mem_ctx == &util_dynarray_is_data_stack_allocated) { |
| 76 | + } else if (buf->mem_ctx) { | ||
| 65 | ralloc_free(buf->data); | 77 | ralloc_free(buf->data); |
| 66 | } else { | 78 | } else { |
| 67 | free(buf->data); | 79 | free(buf->data); |
| @@ -85,7 +97,13 @@ util_dynarray_ensure_cap(struct util_dynarray *buf, unsigned newcap) | |||
| 85 | unsigned capacity = MAX3(DYN_ARRAY_INITIAL_SIZE, buf->capacity * 2, newcap); | 97 | unsigned capacity = MAX3(DYN_ARRAY_INITIAL_SIZE, buf->capacity * 2, newcap); |
| 86 | void *data; | 98 | void *data; |
| 87 | 99 | ||
| 88 | - if (buf->mem_ctx) { | 100 | + if (buf->mem_ctx == &util_dynarray_is_data_stack_allocated) { |
| 101 | + data = malloc(capacity); | ||
| 102 | + if (data) { | ||
| 103 | + memcpy(data, buf->data, buf->size); | ||
| 104 | + buf->mem_ctx = NULL; | ||
| 105 | + } | ||
| 106 | + } else if (buf->mem_ctx) { | ||
| 89 | data = reralloc_size(buf->mem_ctx, buf->data, capacity); | 107 | data = reralloc_size(buf->mem_ctx, buf->data, capacity); |
| 90 | } else { | 108 | } else { |
| 91 | data = realloc(buf->data, capacity); | 109 | data = realloc(buf->data, capacity); |
| @@ -148,6 +166,9 @@ util_dynarray_grow_bytes(struct util_dynarray *buf, unsigned ngrow, size_t eltsi | |||
| 148 | static inline void | 166 | static inline void |
| 149 | util_dynarray_trim(struct util_dynarray *buf) | 167 | util_dynarray_trim(struct util_dynarray *buf) |
| 150 | { | 168 | { |
| 169 | + if (buf->mem_ctx == &util_dynarray_is_data_stack_allocated) | ||
| 170 | + return; | ||
| 171 | + | ||
| 151 | if (buf->size != buf->capacity) { | 172 | if (buf->size != buf->capacity) { |
| 152 | if (buf->size) { | 173 | if (buf->size) { |
| 153 | if (buf->mem_ctx) { | 174 | if (buf->mem_ctx) { |