Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
Archivo: pool.cpp Proyecto: 2asoft/0ad
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;
}