Lines Matching refs:This
5 * copy of this software and associated documentation files (the "Software"),
11 * The above copyright notice and this permission notice (including the next
44 NineSwapChain9_ctor( struct NineSwapChain9 *This,
56 DBG("This=%p pDevice=%p pPresent=%p pCTX=%p hFocusWindow=%p\n",
57 This, pParams->device, pPresent, pCTX, hFocusWindow);
59 hr = NineUnknown_ctor(&This->base, pParams);
63 This->screen = NineDevice9_GetScreen(This->base.device);
64 This->implicit = implicit;
65 This->actx = pCTX;
66 This->present = pPresent;
67 This->mode = NULL;
70 if (This->base.device->minor_version_num > 2) {
74 params2.AllowDISCARDDelayedRelease = This->actx->discard_delayed_release;
75 params2.TearFreeDISCARD = This->actx->tearfree_discard;
82 This->rendering_done = FALSE;
83 This->pool = NULL;
85 This->pending_presentation[i] = calloc(1, sizeof(BOOL));
86 if (!This->pending_presentation[i])
89 return NineSwapChain9_Resize(This, pPresentationParameters, mode);
93 D3DWindowBuffer_create(struct NineSwapChain9 *This,
99 struct pipe_context *pipe = nine_context_get_pipe_acquire(This->base.device);
106 This->screen->resource_get_handle(This->screen, pipe, resource,
111 nine_context_get_pipe_release(This->base.device);
114 hr = ID3DPresent_NewD3DWindowBufferFromDmaBuf(This->present,
132 D3DWindowBuffer_release(struct NineSwapChain9 *This,
138 if (This->base.device->minor_version_num <= 2) {
139 ID3DPresent_DestroyD3DWindowBuffer(This->present, present_handle);
145 if (!This->present_handles_pending_release[i]) {
146 This->present_handles_pending_release[i] = present_handle;
157 if (This->present_handles_pending_release[i] &&
158 ID3DPresent_IsBufferReleased(This->present, This->present_handles_pending_release[i])) {
163 * is postponed for This->present release. To avoid leaks (we may handle
165 ID3DPresent_WaitBufferReleased(This->present, This->present_handles_pending_release[i]);
166 ID3DPresent_DestroyD3DWindowBuffer(This->present, This->present_handles_pending_release[i]);
167 This->present_handles_pending_release[i] = NULL;
173 NineSwapChain9_GetBackBufferCountForParams( struct NineSwapChain9 *This,
177 NineSwapChain9_Resize( struct NineSwapChain9 *This,
181 struct NineDevice9 *pDevice = This->base.device;
191 DBG("This=%p pParams=%p\n", This, pParams);
239 This->desired_fences = This->actx->throttling ? This->actx->throttling_value + 1 : 0;
241 if (This->desired_fences > DRI_SWAP_FENCES_MAX)
242 This->desired_fences = DRI_SWAP_FENCES_MAX;
244 if (This->actx->vblank_mode == 0)
246 else if (This->actx->vblank_mode == 3)
249 if (mode && This->mode) {
250 *(This->mode) = *mode;
252 This->mode = malloc(sizeof(D3DDISPLAYMODEEX));
253 memcpy(This->mode, mode, sizeof(D3DDISPLAYMODEEX));
255 free(This->mode);
256 This->mode = NULL;
261 hr = ID3DPresent_SetPresentParameters(This->present, pParams, This->mode);
265 oldBufferCount = This->num_back_buffers;
266 newBufferCount = NineSwapChain9_GetBackBufferCountForParams(This, pParams);
271 hr = d3dmultisample_type_check(This->screen, pParams->BackBufferFormat,
279 pf = d3d9_to_pipe_format_checked(This->screen, pParams->BackBufferFormat,
283 if (This->actx->linear_framebuffer ||
288 (This->actx->ref && This->actx->ref == This->screen))
319 if (This->tasks[i])
320 _mesa_threadpool_wait_for_task(This->pool, &(This->tasks[i]));
322 memset(This->tasks, 0, sizeof(This->tasks));
324 if (This->pool) {
325 _mesa_threadpool_destroy(This, This->pool);
326 This->pool = NULL;
328 This->enable_threadpool = This->actx->thread_submit && (pParams->SwapEffect != D3DSWAPEFFECT_COPY);
329 if (This->enable_threadpool)
330 This->pool = _mesa_threadpool_create(This);
331 if (!This->pool)
332 This->enable_threadpool = FALSE;
335 D3DWindowBuffer_release(This, This->present_handles[i]);
336 This->present_handles[i] = NULL;
337 if (This->present_buffers[i])
338 pipe_resource_reference(&(This->present_buffers[i]), NULL);
344 NineUnknown_Detach(NineUnknown(This->buffers[i]));
347 This->buffers[i] = NULL;
348 This->present_handles[i] = NULL;
351 This->num_back_buffers = newBufferCount;
359 tmplt.format = d3d9_to_pipe_format_checked(This->screen,
366 resource = nine_resource_create_with_retry(pDevice, This->screen, &tmplt);
373 if (This->buffers[i]) {
374 NineSurface9_SetMultiSampleType(This->buffers[i], desc.MultiSampleType);
375 NineSurface9_SetResourceResize(This->buffers[i], resource);
381 hr = NineSurface9_new(pDevice, NineUnknown(This), resource, NULL, 0,
382 0, 0, &desc, &This->buffers[i]);
389 This->buffers[i]->base.base.forward = FALSE;
396 if (This->actx->linear_framebuffer)
400 resource = nine_resource_create_with_retry(pDevice, This->screen, &tmplt);
401 pipe_resource_reference(&(This->present_buffers[i]), resource);
403 This->present_handles[i] = D3DWindowBuffer_create(This, resource, depth, false);
405 if (!This->present_handles[i]) {
413 tmplt.format = d3d9_to_pipe_format_checked(This->screen,
423 if (This->zsbuf) {
424 resource = nine_resource_create_with_retry(pDevice, This->screen, &tmplt);
430 NineSurface9_SetMultiSampleType(This->zsbuf, desc.MultiSampleType);
431 NineSurface9_SetResourceResize(This->zsbuf, resource);
441 (IDirect3DSurface9 **)&This->zsbuf,
447 NineUnknown_ConvertRefToBind(NineUnknown(This->zsbuf));
451 This->params = *pParams;
466 swap_fences_pop_front(struct NineSwapChain9 *This)
468 struct pipe_screen *screen = This->screen;
471 if (This->desired_fences == 0)
474 if (This->cur_fences >= This->desired_fences) {
475 screen->fence_reference(screen, &fence, This->swap_fences[This->tail]);
476 screen->fence_reference(screen, &This->swap_fences[This->tail++], NULL);
477 This->tail &= DRI_SWAP_FENCES_MASK;
478 --This->cur_fences;
491 swap_fences_see_front(struct NineSwapChain9 *This)
493 struct pipe_screen *screen = This->screen;
496 if (This->desired_fences == 0)
499 if (This->cur_fences >= This->desired_fences) {
500 screen->fence_reference(screen, &fence, This->swap_fences[This->tail]);
513 swap_fences_push_back(struct NineSwapChain9 *This,
516 struct pipe_screen *screen = This->screen;
518 if (!fence || This->desired_fences == 0)
521 while(This->cur_fences == This->desired_fences)
522 swap_fences_pop_front(This);
524 This->cur_fences++;
525 screen->fence_reference(screen, &This->swap_fences[This->head++],
527 This->head &= DRI_SWAP_FENCES_MASK;
537 swap_fences_unref(struct NineSwapChain9 *This)
539 struct pipe_screen *screen = This->screen;
541 while(This->cur_fences) {
542 screen->fence_reference(screen, &This->swap_fences[This->tail++], NULL);
543 This->tail &= DRI_SWAP_FENCES_MASK;
544 --This->cur_fences;
549 NineSwapChain9_dtor( struct NineSwapChain9 *This )
553 DBG("This=%p\n", This);
555 if (This->pool)
556 _mesa_threadpool_destroy(This, This->pool);
559 if (This->pending_presentation[i])
560 FREE(This->pending_presentation[i]);
564 if (This->present_handles_pending_release[i])
565 ID3DPresent_DestroyD3DWindowBuffer(This->present, This->present_handles_pending_release[i]);
568 for (i = 0; i < This->num_back_buffers; i++) {
569 if (This->buffers[i])
570 NineUnknown_Detach(NineUnknown(This->buffers[i]));
571 if (This->present_handles[i])
572 ID3DPresent_DestroyD3DWindowBuffer(This->present, This->present_handles[i]);
573 if (This->present_buffers[i])
574 pipe_resource_reference(&(This->present_buffers[i]), NULL);
576 if (This->zsbuf)
577 NineUnknown_Unbind(NineUnknown(This->zsbuf));
579 if (This->present)
580 ID3DPresent_Release(This->present);
582 swap_fences_unref(This);
583 NineUnknown_dtor(&This->base);
587 create_present_buffer( struct NineSwapChain9 *This,
607 if (This->actx->linear_framebuffer)
609 *resource = nine_resource_create_with_retry(This->base.device, This->screen, &tmplt);
611 *present_handle = D3DWindowBuffer_create(This, *resource, 24, true);
619 handle_draw_cursor_and_hud( struct NineSwapChain9 *This, struct pipe_resource *resource)
621 struct NineDevice9 *device = This->base.device;
649 * This happens to be also the position of the cursor when we are fullscreen.
661 pipe = NineDevice9_GetPipe(This->base.device);
667 (void)NineDevice9_GetPipe(This->base.device);
695 static void pend_present(struct NineSwapChain9 *This,
701 work->screen = This->screen;
702 This->screen->fence_reference(This->screen, &work->fence_to_wait, fence);
703 work->present = This->present;
704 work->present_handle = This->present_handles[0];
706 work->pending_presentation = This->pending_presentation[0];
708 This->tasks[0] = _mesa_threadpool_queue_task(This->pool, work_present, work);
714 present( struct NineSwapChain9 *This,
730 DBG("present: This=%p pSourceRect=%p pDestRect=%p "
733 This, pSourceRect, pDestRect, pDirtyRegion,
734 hDestWindowOverride, (int)dwFlags, This->buffers[0]->base.resource);
740 resource = This->buffers[0]->base.resource;
765 if (This->rendering_done)
768 if (This->params.SwapEffect == D3DSWAPEFFECT_DISCARD)
769 handle_draw_cursor_and_hud(This, resource);
771 hr = ID3DPresent_GetWindowInfo(This->present, hDestWindowOverride, &target_width, &target_height, &target_depth);
779 This->base.device->minor_version_num <= 2) {
799 if (!This->present_buffers[0] &&
802 struct pipe_resource *new_resource[This->num_back_buffers];
803 D3DWindowBuffer *new_handles[This->num_back_buffers];
804 for (i = 0; i < This->num_back_buffers; i++) {
807 create_present_buffer(This, target_width, target_height, &new_resource[i], &new_handles[i]);
812 for (i = 0; i < This->num_back_buffers; i++) {
816 D3DWindowBuffer_release(This, new_handles[i]);
819 for (i = 0; i < This->num_back_buffers; i++) {
820 D3DWindowBuffer_release(This, This->present_handles[i]);
821 This->present_handles[i] = new_handles[i];
822 pipe_resource_reference(&This->present_buffers[i], new_resource[i]);
828 pipe = NineDevice9_GetPipe(This->base.device);
830 if (This->present_buffers[0]) {
833 blit.src.level = 0; /* Note: This->buffers[0]->level should always be 0 */
844 if (target_width != This->present_buffers[0]->width0 ||
845 target_height != This->present_buffers[0]->height0) {
849 create_present_buffer(This, target_width, target_height, &new_resource, &new_handle);
852 D3DWindowBuffer_release(This, This->present_handles[0]);
853 This->present_handles[0] = new_handle;
854 pipe_resource_reference(&This->present_buffers[0], new_resource);
859 resource = This->present_buffers[0];
885 if (This->params.SwapEffect != D3DSWAPEFFECT_DISCARD)
886 handle_draw_cursor_and_hud(This, resource);
891 pipe->flush(pipe, &fence, PIPE_FLUSH_END_OF_FRAME | (This->enable_threadpool ? PIPE_FLUSH_ASYNC : 0));
896 if (This->enable_threadpool)
897 pend_present(This, fence, hDestWindowOverride);
899 swap_fences_push_back(This, fence);
900 This->screen->fence_reference(This->screen, &fence, NULL);
903 This->rendering_done = TRUE;
909 fence = swap_fences_see_front(This);
911 still_draw = !This->screen->fence_finish(This->screen, NULL, fence, 0);
912 This->screen->fence_reference(This->screen, &fence, NULL);
919 fence = swap_fences_pop_front(This);
921 (void) This->screen->fence_finish(This->screen, NULL, fence, PIPE_TIMEOUT_INFINITE);
922 This->screen->fence_reference(This->screen, &fence, NULL);
925 This->rendering_done = FALSE;
927 if (!This->enable_threadpool) {
928 This->tasks[0]=NULL;
930 hr = ID3DPresent_PresentBuffer(This->present, This->present_handles[0], hDestWindowOverride, pSourceRect, pDestRect ? &dest_rect : NULL, NULL, dwFlags);
935 This->base.device->end_scene_since_present = 0;
936 This->base.device->frame_count++;
941 NineSwapChain9_Present( struct NineSwapChain9 *This,
955 DBG("This=%p pSourceRect=%p pDestRect=%p hDestWindowOverride=%p "
957 This, pSourceRect, pDestRect, hDestWindowOverride,
960 if (This->base.device->ex) {
961 if (NineSwapChain9_GetOccluded(This)) {
966 if (NineSwapChain9_GetOccluded(This) ||
967 NineSwapChain9_ResolutionMismatch(This)) {
968 This->base.device->device_needs_reset = TRUE;
970 if (This->base.device->device_needs_reset) {
976 nine_csmt_process(This->base.device);
978 hr = present(This, pSourceRect, pDestRect,
983 if (This->base.device->minor_version_num > 2 &&
984 This->actx->discard_delayed_release &&
985 This->params.SwapEffect == D3DSWAPEFFECT_DISCARD &&
986 This->params.PresentationInterval == D3DPRESENT_INTERVAL_IMMEDIATE) {
991 for (i = 1; i < This->num_back_buffers; i++) {
992 if (!p_atomic_read(This->pending_presentation[i]) &&
993 ID3DPresent_IsBufferReleased(This->present, This->present_handles[i])) {
1001 ID3DPresent_WaitBufferReleaseEvent(This->present);
1006 if (This->tasks[next_buffer])
1007 _mesa_threadpool_wait_for_task(This->pool, &(This->tasks[next_buffer]));
1008 assert(!*This->pending_presentation[next_buffer] && !This->tasks[next_buffer]);
1009 This->tasks[next_buffer] = This->tasks[0];
1010 This->tasks[0] = NULL;
1011 pending_presentation_temp = This->pending_presentation[next_buffer];
1012 This->pending_presentation[next_buffer] = This->pending_presentation[0];
1013 This->pending_presentation[0] = pending_presentation_temp;
1016 pipe_resource_reference(&res, This->buffers[0]->base.resource);
1018 This->buffers[0], This->buffers[next_buffer]->base.resource);
1020 This->buffers[next_buffer], res);
1023 if (This->present_buffers[0]) {
1024 pipe_resource_reference(&res, This->present_buffers[0]);
1025 pipe_resource_reference(&This->present_buffers[0], This->present_buffers[next_buffer]);
1026 pipe_resource_reference(&This->present_buffers[next_buffer], res);
1030 handle_temp = This->present_handles[0];
1031 This->present_handles[0] = This->present_handles[next_buffer];
1032 This->present_handles[next_buffer] = handle_temp;
1034 switch (This->params.SwapEffect) {
1040 pipe_resource_reference(&res, This->buffers[0]->base.resource);
1041 for (i = 1; i < This->num_back_buffers; i++) {
1042 NineSurface9_SetResourceResize(This->buffers[i - 1],
1043 This->buffers[i]->base.resource);
1046 This->buffers[This->num_back_buffers - 1], res);
1049 if (This->present_buffers[0]) {
1050 pipe_resource_reference(&res, This->present_buffers[0]);
1051 for (i = 1; i < This->num_back_buffers; i++)
1052 pipe_resource_reference(&(This->present_buffers[i-1]), This->present_buffers[i]);
1053 pipe_resource_reference(&(This->present_buffers[This->num_back_buffers - 1]), res);
1057 handle_temp = This->present_handles[0];
1058 for (i = 1; i < This->num_back_buffers; i++) {
1059 This->present_handles[i-1] = This->present_handles[i];
1061 This->present_handles[This->num_back_buffers - 1] = handle_temp;
1062 task_temp = This->tasks[0];
1063 for (i = 1; i < This->num_back_buffers; i++) {
1064 This->tasks[i-1] = This->tasks[i];
1066 This->tasks[This->num_back_buffers - 1] = task_temp;
1067 pending_presentation_temp = This->pending_presentation[0];
1068 for (i = 1; i < This->num_back_buffers; i++) {
1069 This->pending_presentation[i-1] = This->pending_presentation[i];
1071 This->pending_presentation[This->num_back_buffers - 1] = pending_presentation_temp;
1079 if (This->tasks[0])
1080 _mesa_threadpool_wait_for_task(This->pool, &(This->tasks[0]));
1081 assert(!*This->pending_presentation[0]);
1083 ID3DPresent_WaitBufferReleased(This->present, This->present_handles[0]);
1086 This->base.device->context.changed.group |= NINE_STATE_FB;
1092 NineSwapChain9_GetFrontBufferData( struct NineSwapChain9 *This,
1096 struct NineDevice9 *pDevice = This->base.device;
1104 DBG("GetFrontBufferData: This=%p pDestSurface=%p\n",
1105 This, pDestSurface);
1115 create_present_buffer(This, width, height, &temp_resource, &temp_handle);
1130 hr = NineSurface9_new(pDevice, NineUnknown(This), temp_resource, NULL, 0,
1138 ID3DPresent_FrontBufferCopy(This->present, temp_handle);
1142 ID3DPresent_DestroyD3DWindowBuffer(This->present, temp_handle);
1149 NineSwapChain9_GetBackBuffer( struct NineSwapChain9 *This,
1154 DBG("GetBackBuffer: This=%p iBackBuffer=%d Type=%d ppBackBuffer=%p\n",
1155 This, iBackBuffer, Type, ppBackBuffer);
1159 user_assert(iBackBuffer < This->params.BackBufferCount, D3DERR_INVALIDCALL);
1161 NineUnknown_AddRef(NineUnknown(This->buffers[iBackBuffer]));
1162 *ppBackBuffer = (IDirect3DSurface9 *)This->buffers[iBackBuffer];
1167 NineSwapChain9_GetRasterStatus( struct NineSwapChain9 *This,
1170 DBG("GetRasterStatus: This=%p pRasterStatus=%p\n",
1171 This, pRasterStatus);
1173 return ID3DPresent_GetRasterStatus(This->present, pRasterStatus);
1177 NineSwapChain9_GetDisplayMode( struct NineSwapChain9 *This,
1184 DBG("GetDisplayMode: This=%p pMode=%p\n",
1185 This, pMode);
1188 hr = ID3DPresent_GetDisplayMode(This->present, &mode, &rot);
1199 NineSwapChain9_GetPresentParameters( struct NineSwapChain9 *This,
1202 DBG("GetPresentParameters: This=%p pPresentationParameters=%p\n",
1203 This, pPresentationParameters);
1205 *pPresentationParameters = This->params;
1243 NineSwapChain9_GetOccluded( struct NineSwapChain9 *This )
1245 if (This->base.device->minor_version_num > 0) {
1246 return ID3DPresent_GetWindowOccluded(This->present);
1253 NineSwapChain9_ResolutionMismatch( struct NineSwapChain9 *This )
1255 if (This->base.device->minor_version_num > 1) {
1256 return ID3DPresent_ResolutionMismatch(This->present);
1263 NineSwapChain9_CreateThread( struct NineSwapChain9 *This,
1267 if (This->base.device->minor_version_num > 1) {
1268 return ID3DPresent_CreateThread(This->present, pFuncAddress, pParam);
1275 NineSwapChain9_WaitForThread( struct NineSwapChain9 *This,
1278 if (This->base.device->minor_version_num > 1) {
1279 (void) ID3DPresent_WaitForThread(This->present, thread);
1284 NineSwapChain9_GetBackBufferCountForParams( struct NineSwapChain9 *This,
1297 /* thread_submit's can have maximum count or This->actx->throttling_value + 1
1300 if (This->actx->thread_submit && count < This->desired_fences)
1301 count = This->desired_fences;
1309 if (This->base.device->minor_version_num > 2 &&
1310 This->actx->discard_delayed_release &&
1312 if (This->actx->thread_submit && count < 4)
1317 else if (!This->actx->thread_submit && count < 5)
1319 /* Somehow this cases needs 5 with thread_submit, or else you get a small performance hit */
1320 if (This->actx->tearfree_discard && count < 5)