Lines Matching refs:This
6 * copy of this software and associated documentation files (the "Software"),
12 * The above copyright notice and this permission notice (including the next
42 NineBuffer9_ctor( struct NineBuffer9 *This,
49 struct pipe_resource *info = &This->base.info;
52 DBG("This=%p Size=0x%x Usage=%x Pool=%u\n", This, Size, Usage, Pool);
56 This->maps = MALLOC(sizeof(struct NineTransfer));
57 if (!This->maps)
59 This->nlocks = 0;
60 This->nmaps = 0;
61 This->maxmaps = 1;
62 This->size = Size;
95 * this is going to be very significantly faster that way.
140 This->discard_nooverwrite_only = !!(Usage & D3DUSAGE_WRITEONLY) &&
156 hr = NineResource9_ctor(&This->base, pParams, NULL, TRUE,
163 This->managed.data = align_calloc(
164 nine_format_get_level_alloc_size(This->base.info.format,
166 if (!This->managed.data)
168 This->managed.dirty = TRUE;
169 u_box_1d(0, Size, &This->managed.dirty_box);
170 u_box_1d(0, 0, &This->managed.valid_region);
171 u_box_1d(0, 0, &This->managed.required_valid_region);
172 u_box_1d(0, 0, &This->managed.filled_region);
173 This->managed.can_unsynchronized = true;
174 This->managed.num_worker_thread_syncs = 0;
175 list_inithead(&This->managed.list);
176 list_inithead(&This->managed.list2);
177 list_add(&This->managed.list2, &pParams->device->managed_buffers);
184 NineBuffer9_dtor( struct NineBuffer9 *This )
186 DBG("This=%p\n", This);
188 if (This->maps) {
189 while (This->nlocks) {
190 NineBuffer9_Unlock(This);
192 assert(!This->nmaps);
193 FREE(This->maps);
196 if (This->base.pool != D3DPOOL_DEFAULT) {
197 if (This->managed.data)
198 align_free(This->managed.data);
199 if (list_is_linked(&This->managed.list))
200 list_del(&This->managed.list);
201 if (list_is_linked(&This->managed.list2))
202 list_del(&This->managed.list2);
205 if (This->buf)
206 nine_upload_release_buffer(This->base.base.device->buffer_upload, This->buf);
208 NineResource9_dtor(&This->base);
212 NineBuffer9_GetResource( struct NineBuffer9 *This, unsigned *offset )
214 if (This->buf)
215 return nine_upload_buffer_resource_and_offset(This->buf, offset);
217 return NineResource9_GetResource(&This->base);
221 NineBuffer9_RebindIfRequired( struct NineBuffer9 *This,
228 if (!This->bind_count)
231 if (device->state.stream[i] == (struct NineVertexBuffer9 *)This)
237 if (device->state.idxbuf == (struct NineIndexBuffer9 *)This)
239 ((struct NineIndexBuffer9 *)This)->index_size,
244 NineBuffer9_Lock( struct NineBuffer9 *This,
250 struct NineDevice9 *device = This->base.base.device;
256 DBG("This=%p(pipe=%p) OffsetToLock=0x%x, SizeToLock=0x%x, Flags=0x%x\n",
257 This, This->base.resource,
263 SizeToLock = This->size - OffsetToLock;
272 if (!(This->base.usage & D3DUSAGE_DYNAMIC) && This->base.pool == D3DPOOL_DEFAULT)
273 SizeToLock = This->size - OffsetToLock;
277 if (This->base.pool != D3DPOOL_DEFAULT) {
285 if (This->base.pool == D3DPOOL_MANAGED) {
287 if (!This->managed.dirty) {
288 assert(list_is_empty(&This->managed.list));
289 This->managed.dirty = TRUE;
290 This->managed.dirty_box = box;
292 if (p_atomic_read(&This->managed.pending_upload)) {
293 u_box_intersect_1d(&box, &box, &This->managed.upload_pending_regions);
295 nine_csmt_process(This->base.base.device);
298 u_box_union_1d(&This->managed.dirty_box, &This->managed.dirty_box, &box);
301 BASEBUF_REGISTER_UPDATE(This);
305 p_atomic_read(&This->managed.pending_upload)) {
306 This->managed.num_worker_thread_syncs++;
308 if (This->managed.num_worker_thread_syncs >= 3)
309 This->managed.can_unsynchronized = false;
310 nine_csmt_process(This->base.base.device);
314 * OF THIS FRAME are unaffected. As we flush csmt in Present(),
320 This->managed.dirty = true;
321 u_box_1d(0, This->size, &This->managed.dirty_box); /* systemmem non-dynamic */
322 u_box_1d(0, 0, &This->managed.valid_region); /* systemmem dynamic */
323 BASEBUF_REGISTER_UPDATE(This);
326 *ppbData = (char *)This->managed.data + OffsetToLock;
328 This->nlocks++;
345 /* Have NOOVERWRITE win over DISCARD. This is allowed (see above) and
357 usage = (This->base.usage & D3DUSAGE_WRITEONLY) ?
360 if (Flags & D3DLOCK_DONOTWAIT && !(This->base.usage & D3DUSAGE_DYNAMIC))
363 This->discard_nooverwrite_only &= !!(Flags & (D3DLOCK_DISCARD | D3DLOCK_NOOVERWRITE));
365 if (This->nmaps == This->maxmaps) {
367 REALLOC(This->maps, sizeof(struct NineTransfer)*This->maxmaps,
368 sizeof(struct NineTransfer)*(This->maxmaps << 1));
372 This->maxmaps <<= 1;
373 This->maps = newmaps;
376 if (This->buf && !This->discard_nooverwrite_only) {
387 src_res = nine_upload_buffer_resource_and_offset(This->buf, &offset);
388 u_box_1d(offset, This->size, &src_box);
391 pipe->resource_copy_region(pipe, This->base.resource, 0, 0, 0, 0,
394 if (This->nmaps >= 1)
395 This->maps[This->nmaps-1].should_destroy_buf = true;
397 nine_upload_release_buffer(device->buffer_upload, This->buf);
398 This->buf = NULL;
400 NineBuffer9_RebindIfRequired(This, device, This->base.resource, 0);
403 This->maps[This->nmaps].transfer = NULL;
404 This->maps[This->nmaps].is_pipe_secondary = false;
405 This->maps[This->nmaps].buf = NULL;
406 This->maps[This->nmaps].should_destroy_buf = false;
408 if (This->discard_nooverwrite_only) {
409 if (This->buf && (Flags & D3DLOCK_DISCARD)) {
411 if (This->nmaps >= 1)
412 This->maps[This->nmaps-1].should_destroy_buf = true;
414 nine_upload_release_buffer(device->buffer_upload, This->buf);
415 This->buf = NULL;
418 if (!This->buf) {
421 This->buf = nine_upload_create_buffer(device->buffer_upload, This->base.info.width0);
422 res = nine_upload_buffer_resource_and_offset(This->buf, &offset);
423 NineBuffer9_RebindIfRequired(This, device, res, offset);
426 if (This->buf) {
427 This->maps[This->nmaps].buf = This->buf;
428 This->nmaps++;
429 This->nlocks++;
430 DBG("Returning %p\n", nine_upload_buffer_get_map(This->buf) + OffsetToLock);
431 *ppbData = nine_upload_buffer_get_map(This->buf) + OffsetToLock;
435 This->discard_nooverwrite_only = false;
442 * Note for discard_nooverwrite_only we don't need to do this
444 if (This->need_sync_if_nooverwrite && !(Flags & D3DLOCK_DISCARD) &&
454 This->need_sync_if_nooverwrite = !(Flags & (D3DLOCK_DISCARD | D3DLOCK_NOOVERWRITE));
461 struct pipe_resource *new_res = nine_resource_create_with_retry(device, screen, &This->base.info);
464 pipe_resource_reference(&This->base.resource, new_res);
467 NineBuffer9_RebindIfRequired(This, device, This->base.resource, 0);
468 This->maps[This->nmaps].is_pipe_secondary = TRUE;
471 This->maps[This->nmaps].is_pipe_secondary = TRUE;
473 if (This->maps[This->nmaps].is_pipe_secondary)
478 data = pipe->buffer_map(pipe, This->base.resource, 0,
479 usage, &box, &This->maps[This->nmaps].transfer);
494 This->nmaps++;
495 This->nlocks++;
502 NineBuffer9_Unlock( struct NineBuffer9 *This )
504 struct NineDevice9 *device = This->base.base.device;
507 DBG("This=%p\n", This);
509 user_assert(This->nlocks > 0, D3DERR_INVALIDCALL);
510 This->nlocks--;
511 if (This->nlocks > 0)
514 if (This->base.pool == D3DPOOL_DEFAULT) {
515 for (i = 0; i < This->nmaps; i++) {
516 if (!This->maps[i].buf) {
517 pipe = This->maps[i].is_pipe_secondary ?
520 pipe->buffer_unmap(pipe, This->maps[i].transfer);
522 if (This->maps[i].is_pipe_secondary)
526 } else if (This->maps[i].should_destroy_buf)
527 nine_upload_release_buffer(device->buffer_upload, This->maps[i].buf);
529 This->nmaps = 0;
535 NineBuffer9_SetDirty( struct NineBuffer9 *This )
537 assert(This->base.pool != D3DPOOL_DEFAULT);
539 This->managed.dirty = TRUE;
540 u_box_1d(0, This->size, &This->managed.dirty_box);
541 BASEBUF_REGISTER_UPDATE(This);
565 NineBuffer9_Upload( struct NineBuffer9 *This )
567 struct NineDevice9 *device = This->base.base.device;
571 assert(This->base.pool != D3DPOOL_DEFAULT && This->managed.dirty);
573 if (This->base.pool == D3DPOOL_SYSTEMMEM && This->base.usage & D3DUSAGE_DYNAMIC) {
576 struct pipe_box *valid_region = &This->managed.valid_region;
577 struct pipe_box *required_valid_region = &This->managed.required_valid_region;
578 struct pipe_box *filled_region = &This->managed.filled_region;
582 * fills This->managed.required_valid_region for that */
591 if (!This->managed.can_unsynchronized)
592 NineBuffer9_RebindIfRequired(This, device, This->base.resource, 0);
615 if (This->managed.can_unsynchronized && (conflicting_region.width == 0 ||
628 * . We have not discarded yet this frame
631 if (This->managed.num_worker_thread_syncs < 3 &&
632 (filled_region->width > (This->size / 2) ||
636 This->managed.frame_count_last_discard != device->frame_count)) {
641 This, valid_region->x, valid_region->width, filled_region->x, filled_region->width,
648 box_upload = This->managed.required_valid_region;
650 if (!This->managed.can_unsynchronized)
651 NineBuffer9_RebindIfRequired(This, device, This->base.resource, 0);
652 This->managed.can_unsynchronized = true;
653 This->managed.frame_count_last_discard = device->frame_count;
659 This->managed.can_unsynchronized = false;
664 This->managed.data + required_valid_region->x,
670 NineBuffer9_RebindIfRequired(This, device, resource, buffer_offset);
671 /* Note: This only works because for these types of buffers this function
673 * rebinds buffers. In addition it needs this function to be called only
690 box_upload = This->managed.dirty_box;
692 if (box_upload.x == 0 && box_upload.width == This->size) {
696 if (This->managed.pending_upload) {
697 u_box_union_1d(&This->managed.upload_pending_regions,
698 &This->managed.upload_pending_regions,
701 This->managed.upload_pending_regions = box_upload;
706 This, box_upload.x, box_upload.width, upload_flags);
707 nine_context_range_upload(device, &This->managed.pending_upload,
708 (struct NineUnknown *)This,
709 This->base.resource,
713 (char *)This->managed.data + box_upload.x);
714 This->managed.dirty = FALSE;