Lines Matching refs:This

9  * This library is free software; you can redistribute it and/or
14 * This library is distributed in the hope that it will be useful,
46 static inline BOOL buffer_add_dirty_area(struct wined3d_buffer *This, UINT offset, UINT size)
48 if (!This->buffer_object) return TRUE;
50 if (This->maps_size <= This->modified_areas)
52 void *new = HeapReAlloc(GetProcessHeap(), 0, This->maps,
53 This->maps_size * 2 * sizeof(*This->maps));
61 This->maps = new;
62 This->maps_size *= 2;
66 if(offset > This->resource.size || offset + size > This->resource.size)
70 size = This->resource.size;
74 size = This->resource.size;
77 This->maps[This->modified_areas].offset = offset;
78 This->maps[This->modified_areas].size = size;
79 This->modified_areas++;
83 static inline void buffer_clear_dirty_areas(struct wined3d_buffer *This)
85 This->modified_areas = 0;
106 static void delete_gl_buffer(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info)
108 if(!This->buffer_object) return;
110 GL_EXTCALL(glDeleteBuffersARB(1, &This->buffer_object));
112 This->buffer_object = 0;
114 if(This->query)
116 wined3d_event_query_destroy(This->query);
117 This->query = NULL;
119 This->flags &= ~WINED3D_BUFFER_APPLESYNC;
123 static void buffer_create_buffer_object(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info)
129 This, debug_d3dusage(This->resource.usage));
140 * buffer is interpreted. This means that on each draw call the buffer has
144 GL_EXTCALL(glGenBuffersARB(1, &This->buffer_object));
146 if (!This->buffer_object || error != GL_NO_ERROR)
152 if (This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
153 device_invalidate_state(This->resource.device, STATE_INDEXBUFFER);
154 GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
162 if (This->resource.usage & WINED3DUSAGE_DYNAMIC)
169 GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE));
170 checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE)");
171 This->flags |= WINED3D_BUFFER_FLUSH;
173 GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE));
174 checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE)");
175 This->flags |= WINED3D_BUFFER_APPLESYNC;
185 GL_EXTCALL(glBufferDataARB(This->buffer_type_hint, This->resource.size, This->resource.allocatedMemory, gl_usage));
193 This->buffer_object_size = This->resource.size;
194 This->buffer_object_usage = gl_usage;
196 if(This->flags & WINED3D_BUFFER_DOUBLEBUFFER)
198 if(!buffer_add_dirty_area(This, 0, 0))
206 HeapFree(GetProcessHeap(), 0, This->resource.heapMemory);
207 This->resource.allocatedMemory = NULL;
208 This->resource.heapMemory = NULL;
216 delete_gl_buffer(This, gl_info);
217 buffer_clear_dirty_areas(This);
220 static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This,
264 if (This->stride != *stride_this_run
265 || This->offset != *offset_this_run)
267 if (This->stride != *stride_this_run)
274 This->stride = *stride_this_run;
276 This->offset = *offset_this_run;
278 HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, This->conversion_map);
279 This->conversion_map = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
280 sizeof(*This->conversion_map) * This->stride);
286 data = ((DWORD_PTR)attrib->data.addr) % This->stride;
292 DWORD_PTR idx = (data + i) % This->stride;
296 if (This->conversion_map[idx] != conversion_type)
299 TRACE("It was type %d, is %d now\n", This->conversion_map[idx], conversion_type);
301 This->conversion_map[idx] = conversion_type;
308 static BOOL buffer_check_attribute(struct wined3d_buffer *This, const struct wined3d_stream_info *si,
324 || attrib->data.buffer_object != This->buffer_object)
331 ret = buffer_process_converted_attribute(This, CONV_D3DCOLOR, attrib, stride_this_run
347 ret = buffer_process_converted_attribute(This, CONV_POSITIONT, attrib, stride_this_run
353 else if (This->conversion_map)
355 ret = buffer_process_converted_attribute(This, CONV_NONE, attrib, stride_this_run
365 static BOOL buffer_find_decl(struct wined3d_buffer *This)
367 struct wined3d_device *device = This->resource.device;
383 if (This->flags & WINED3D_BUFFER_HASDESC)
385 if(This->resource.usage & WINED3DUSAGE_STATICDECL) return FALSE;
391 if(This->conversion_map)
393 HeapFree(GetProcessHeap(), 0, This->conversion_map);
394 This->conversion_map = NULL;
395 This->stride = 0;
404 * opengl. This means D3DCOLOR attributes with fixed function vertex
421 * This code sets up a per-byte array with the size of the detected
448 ret = buffer_check_attribute(This, si, WINED3D_FFP_POSITION,
454 ret = buffer_check_attribute(This, si, WINED3D_FFP_NORMAL,
460 ret = buffer_check_attribute(This, si, WINED3D_FFP_DIFFUSE,
466 ret = buffer_check_attribute(This, si, WINED3D_FFP_SPECULAR,
472 ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD0,
478 ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD1,
484 ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD2,
490 ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD3,
496 ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD4,
502 ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD5,
508 ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD6,
514 ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD7,
521 if (!stride_this_run && This->conversion_map)
525 HeapFree(GetProcessHeap(), 0, This->conversion_map);
526 This->conversion_map = NULL;
527 This->stride = 0;
602 BYTE *buffer_get_sysmem(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info)
605 if(This->resource.allocatedMemory) return This->resource.allocatedMemory;
607 This->resource.heapMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->resource.size + RESOURCE_ALIGNMENT);
608 This->resource.allocatedMemory = (BYTE *)(((ULONG_PTR)This->resource.heapMemory + (RESOURCE_ALIGNMENT - 1)) & ~(RESOURCE_ALIGNMENT - 1));
610 if (This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
611 device_invalidate_state(This->resource.device, STATE_INDEXBUFFER);
613 GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
614 GL_EXTCALL(glGetBufferSubDataARB(This->buffer_type_hint, 0, This->resource.size, This->resource.allocatedMemory));
615 This->flags |= WINED3D_BUFFER_DOUBLEBUFFER;
617 return This->resource.allocatedMemory;
703 static void buffer_sync_apple(struct wined3d_buffer *This, DWORD flags, const struct wined3d_gl_info *gl_info)
714 GL_EXTCALL(glBufferDataARB(This->buffer_type_hint, This->resource.size, NULL, This->buffer_object_usage));
719 if(!This->query)
721 TRACE("Creating event query for buffer %p\n", This);
729 This->query = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->query));
730 if (!This->query)
740 TRACE("Synchronizing buffer %p\n", This);
741 ret = wined3d_event_query_finish(This->query, This->resource.device);
759 if(This->query)
761 wined3d_event_query_destroy(This->query);
762 This->query = NULL;
766 GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE));
767 checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE)");
768 This->flags &= ~WINED3D_BUFFER_APPLESYNC;
772 static void buffer_direct_upload(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info, DWORD flags)
777 /* This potentially invalidates the element array buffer binding, but the
779 GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
789 map = GL_EXTCALL(glMapBufferRange(This->buffer_type_hint, 0,
790 This->resource.size, mapflags));
795 if (This->flags & WINED3D_BUFFER_APPLESYNC)
802 buffer_sync_apple(This, syncflags, gl_info);
804 map = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_WRITE_ONLY_ARB));
813 while (This->modified_areas)
815 This->modified_areas--;
816 start = This->maps[This->modified_areas].offset;
817 len = This->maps[This->modified_areas].size;
819 memcpy(map + start, This->resource.allocatedMemory + start, len);
823 GL_EXTCALL(glFlushMappedBufferRange(This->buffer_type_hint, start, len));
826 else if (This->flags & WINED3D_BUFFER_FLUSH)
828 GL_EXTCALL(glFlushMappedBufferRangeAPPLE(This->buffer_type_hint, start, len));
832 GL_EXTCALL(glUnmapBufferARB(This->buffer_type_hint));
939 * reload. This happens only once per changed vertexbuffer and
1299 * This is also needed to prevent Map from returning garbage on