已开启
解决黎明觉醒游戏 vulkan驱动崩溃问题 #13
maoyue0730创建于 2025年12月18日
解决黎明觉醒游戏 vulkan驱动崩溃问题 #13
已开启
maoyue0730创建于 2025年12月18日
2 个文件变更+744-456
@@ -36,6 +36,8 @@
36extern "C" {36extern "C" {
37#endif37#endif
38 38 
39+static unsigned util_dynarray_is_data_stack_allocated;
40+ 
39/* A zero-initialized version of this is guaranteed to represent an41/* 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+ 
60static inline void71static inline void
61util_dynarray_fini(struct util_dynarray *buf)72util_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
148static inline void166static inline void
149util_dynarray_trim(struct util_dynarray *buf)167util_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) {