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); }
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); }
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); }
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); } }