static bool create_buffers(struct gs_vertex_buffer *vb) { GLenum usage = vb->dynamic ? GL_STREAM_DRAW : GL_STATIC_DRAW; size_t i; if (!gl_create_buffer(GL_ARRAY_BUFFER, &vb->vertex_buffer, vb->data->num * sizeof(struct vec3), vb->data->points, usage)) return false; if (vb->data->normals) { if (!gl_create_buffer(GL_ARRAY_BUFFER, &vb->normal_buffer, vb->data->num * sizeof(struct vec3), vb->data->normals, usage)) return false; } if (vb->data->tangents) { if (!gl_create_buffer(GL_ARRAY_BUFFER, &vb->tangent_buffer, vb->data->num * sizeof(struct vec3), vb->data->tangents, usage)) return false; } if (vb->data->colors) { if (!gl_create_buffer(GL_ARRAY_BUFFER, &vb->color_buffer, vb->data->num * sizeof(uint32_t), vb->data->colors, usage)) return false; } da_reserve(vb->uv_buffers, vb->data->num_tex); da_reserve(vb->uv_sizes, vb->data->num_tex); for (i = 0; i < vb->data->num_tex; i++) { GLuint tex_buffer; struct gs_tvertarray *tv = vb->data->tvarray+i; size_t size = vb->data->num * sizeof(float) * tv->width; if (!gl_create_buffer(GL_ARRAY_BUFFER, &tex_buffer, size, tv->array, usage)) return false; da_push_back(vb->uv_buffers, &tex_buffer); da_push_back(vb->uv_sizes, &tv->width); } if (!vb->dynamic) { gs_vbdata_destroy(vb->data); vb->data = NULL; } if (!gl_gen_vertex_arrays(1, &vb->vao)) return false; return true; }
Status da_append(DynArray* da, const void* data, size_t size) { RETURN_STATUS_IF_ERR(da_reserve(da, size)); memcpy(da->base+da->pos, data, size); da->pos += size; return INFO::OK; }
static void create_bitmap_sizes(struct font_path_info *info, FT_Face face) { DARRAY(int) sizes; if (!info->is_bitmap) { info->num_sizes = 0; info->sizes = NULL; return; } da_init(sizes); da_reserve(sizes, face->num_fixed_sizes); for (int i = 0; i < face->num_fixed_sizes; i++) { int val = face->available_sizes[i].size >> 6; da_push_back(sizes, &val); } info->sizes = sizes.array; info->num_sizes = face->num_fixed_sizes; }
void* pool_alloc(Pool* p, size_t size) { TIMER_ACCRUE(tc_pool_alloc); // if pool allows variable sizes, go with the size parameter, // otherwise the pool el_size setting. const size_t el_size = p->el_size? p->el_size : Align<allocationAlignment>(size); ASSERT(el_size != 0); // note: freelist is always empty in pools with variable-sized elements // because they disallow pool_free. void* el = mem_freelist_Detach(p->freelist); if(!el) // freelist empty, need to allocate a new entry { // expand, if necessary if(da_reserve(&p->da, el_size) < 0) return 0; el = p->da.base + p->da.pos; p->da.pos += el_size; } ASSERT(pool_contains(p, el)); // paranoia return el; }