Home | Info | Community | Development | myReactOS | Contact Us
[static]
Definition at line 116 of file buffer.c.
Referenced by buffer_get_memory(), and wined3d_buffer_preload().
{ GLenum error, gl_usage; TRACE("Creating an OpenGL vertex buffer object for wined3d_buffer %p with usage %s.\n", This, debug_d3dusage(This->resource.usage)); ENTER_GL(); /* Make sure that the gl error is cleared. Do not use checkGLcall * here because checkGLcall just prints a fixme and continues. However, * if an error during VBO creation occurs we can fall back to non-vbo operation * with full functionality(but performance loss) */ while (glGetError() != GL_NO_ERROR); /* Basically the FVF parameter passed to CreateVertexBuffer is no good. * The vertex declaration from the device determines how the data in the * buffer is interpreted. This means that on each draw call the buffer has * to be verified to check if the rhw and color values are in the correct * format. */ GL_EXTCALL(glGenBuffersARB(1, &This->buffer_object)); error = glGetError(); if (!This->buffer_object || error != GL_NO_ERROR) { ERR("Failed to create a VBO with error %s (%#x)\n", debug_glerror(error), error); LEAVE_GL(); goto fail; } if (This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB) device_invalidate_state(This->resource.device, STATE_INDEXBUFFER); GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object)); error = glGetError(); if (error != GL_NO_ERROR) { ERR("Failed to bind the VBO with error %s (%#x)\n", debug_glerror(error), error); LEAVE_GL(); goto fail; } /* Don't use static, because dx apps tend to update the buffer * quite often even if they specify 0 usage. */ if(This->resource.usage & WINED3DUSAGE_DYNAMIC) { TRACE("Gl usage = GL_STREAM_DRAW_ARB\n"); gl_usage = GL_STREAM_DRAW_ARB; if(gl_info->supported[APPLE_FLUSH_BUFFER_RANGE]) { GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE)); checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE)"); This->flags |= WINED3D_BUFFER_FLUSH; GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE)); checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE)"); This->flags |= WINED3D_BUFFER_APPLESYNC; } /* No setup is needed here for GL_ARB_map_buffer_range */ } else { TRACE("Gl usage = GL_DYNAMIC_DRAW_ARB\n"); gl_usage = GL_DYNAMIC_DRAW_ARB; } /* Reserve memory for the buffer. The amount of data won't change * so we are safe with calling glBufferData once and * calling glBufferSubData on updates. Upload the actual data in case * we're not double buffering, so we can release the heap mem afterwards */ GL_EXTCALL(glBufferDataARB(This->buffer_type_hint, This->resource.size, This->resource.allocatedMemory, gl_usage)); error = glGetError(); LEAVE_GL(); if (error != GL_NO_ERROR) { ERR("glBufferDataARB failed with error %s (%#x)\n", debug_glerror(error), error); goto fail; } This->buffer_object_size = This->resource.size; This->buffer_object_usage = gl_usage; if(This->flags & WINED3D_BUFFER_DOUBLEBUFFER) { if(!buffer_add_dirty_area(This, 0, 0)) { ERR("buffer_add_dirty_area failed, this is not expected\n"); goto fail; } } else { HeapFree(GetProcessHeap(), 0, This->resource.heapMemory); This->resource.allocatedMemory = NULL; This->resource.heapMemory = NULL; } return; fail: /* Clean up all vbo init, but continue because we can work without a vbo :-) */ ERR("Failed to create a vertex buffer object. Continuing, but performance issues may occur\n"); delete_gl_buffer(This, gl_info); buffer_clear_dirty_areas(This); }