Example #1
0
static void opengl_init_arrays(indexed_vertex_source *vert_src, vertex_buffer *bufferp)
{
	GLubyte *ptr = NULL;

	if ( vert_src->Vbuffer_handle >= 0 ) {
		opengl_bind_buffer_object(vert_src->Vbuffer_handle);
	} else {
		ptr = (GLubyte*)vert_src->Vertex_list;
	}
	
	opengl_bind_vertex_layout(bufferp->layout, 0, ptr);
}
Example #2
0
void opengl_update_buffer_data_offset(int handle, uint offset, uint size, void* data)
{
	GR_DEBUG_SCOPE("Update buffer data with offset");

	Assert(handle >= 0);
	Assert((size_t)handle < GL_buffer_objects.size());

	opengl_buffer_object &buffer_obj = GL_buffer_objects[handle];

	opengl_bind_buffer_object(handle);
	
	glBufferSubData(buffer_obj.type, offset, size, data);
}
Example #3
0
void gr_opengl_update_buffer_data(int handle, size_t size, void* data)
{
	GR_DEBUG_SCOPE("Update buffer data");

	Assert(handle >= 0);
	Assert((size_t)handle < GL_buffer_objects.size());

	opengl_buffer_object &buffer_obj = GL_buffer_objects[handle];

	opengl_bind_buffer_object(handle);

	GL_vertex_data_in -= buffer_obj.size;
	buffer_obj.size = size;
	GL_vertex_data_in += buffer_obj.size;

	glBufferData(buffer_obj.type, size, data, buffer_obj.usage);
}
Example #4
0
void opengl_render_model_program(model_material* material_info, indexed_vertex_source *vert_source, vertex_buffer* bufferp, buffer_data *datap)
{
	GL_state.Texture.SetShaderMode(GL_TRUE);

	opengl_tnl_set_model_material(material_info);

	GLubyte *ibuffer = NULL;

	size_t start = 0;
	size_t end = (datap->n_verts - 1);
	size_t count = (end - (start * 3) + 1);

	GLenum element_type = (datap->flags & VB_FLAG_LARGE_INDEX) ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT;

	Assert(vert_source);

	// basic setup of all data
	opengl_init_arrays(vert_source, bufferp);

	if ( vert_source->Ibuffer_handle >= 0 ) {
		opengl_bind_buffer_object(vert_source->Ibuffer_handle);
	} else {
		ibuffer = (GLubyte*)vert_source->Index_list;
	}

	if ( Rendering_to_shadow_map ) {
		glDrawElementsInstancedBaseVertex(GL_TRIANGLES, (GLsizei) count, element_type,
										  ibuffer + (datap->index_offset + start), 4, (GLint)bufferp->vertex_num_offset);
	} else {
		if ( Cmdline_drawelements ) {
			glDrawElementsBaseVertex(GL_TRIANGLES, (GLsizei) count,
									 element_type, ibuffer + (datap->index_offset + start), (GLint)bufferp->vertex_num_offset);
		} else {
			glDrawRangeElementsBaseVertex(GL_TRIANGLES, datap->i_first, datap->i_last, (GLsizei) count,
										  element_type, ibuffer + (datap->index_offset + start), (GLint)bufferp->vertex_num_offset);
		}
	}

	GL_state.Texture.SetShaderMode(GL_FALSE);
}
void gr_opengl_update_buffer_data(int handle, size_t size, void* data)
{
	// This has to be verified by the caller or else we will run into OPenGL errors
	Assertion(size > 0, "Buffer updates must include some data!");

	GR_DEBUG_SCOPE("Update buffer data");

	Assert(handle >= 0);
	Assert((size_t)handle < GL_buffer_objects.size());

	opengl_buffer_object &buffer_obj = GL_buffer_objects[handle];

	opengl_bind_buffer_object(handle);

	if (size <= buffer_obj.size && buffer_obj.type == GL_UNIFORM_BUFFER) {
		// Uniform buffer can use unsychronized buffer mapping since those are always synchronized by us
		// We also don't care about the previous data and tell OpenGL to map the buffer unsynchronized.
		auto ptr = glMapBufferRange(buffer_obj.type,
									0,
									size,
									GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
		if (ptr == nullptr) {
			// Something went wrong, try subdata instead
			glBufferSubData(buffer_obj.type, 0, size, data);
		} else {
			memcpy(ptr, data, size);

			glUnmapBuffer(buffer_obj.type);
		}
	} else {
		GL_vertex_data_in -= buffer_obj.size;
		buffer_obj.size = size;
		GL_vertex_data_in += buffer_obj.size;

		glBufferData(buffer_obj.type, size, data, buffer_obj.usage);
	}
}