HRESULT NINE_WINAPI NineSwapChain9_GetFrontBufferData( struct NineSwapChain9 *This, IDirect3DSurface9 *pDestSurface ) { struct NineSurface9 *dest_surface = NineSurface9(pDestSurface); struct NineDevice9 *pDevice = This->base.device; unsigned int width, height; struct pipe_resource *temp_resource; struct NineSurface9 *temp_surface; D3DWindowBuffer *temp_handle; D3DSURFACE_DESC desc; HRESULT hr; DBG("GetFrontBufferData: This=%p pDestSurface=%p\n", This, pDestSurface); user_assert(dest_surface->base.pool == D3DPOOL_SYSTEMMEM, D3DERR_INVALIDCALL); width = dest_surface->desc.Width; height = dest_surface->desc.Height; /* Note: front window size and destination size are supposed * to match. However it's not very clear what should get taken in Windowed * mode. It may need a fix */ create_present_buffer(This, width, height, &temp_resource, &temp_handle); if (!temp_resource || !temp_handle) { return D3DERR_INVALIDCALL; } desc.Type = D3DRTYPE_SURFACE; desc.Pool = D3DPOOL_DEFAULT; desc.MultiSampleType = D3DMULTISAMPLE_NONE; desc.MultiSampleQuality = 0; desc.Width = width; desc.Height = height; /* NineSurface9_CopyDefaultToMem needs same format. */ desc.Format = dest_surface->desc.Format; desc.Usage = D3DUSAGE_RENDERTARGET; hr = NineSurface9_new(pDevice, NineUnknown(This), temp_resource, NULL, 0, 0, 0, &desc, &temp_surface); pipe_resource_reference(&temp_resource, NULL); if (FAILED(hr)) { DBG("Failed to create temp FrontBuffer surface.\n"); return hr; } ID3DPresent_FrontBufferCopy(This->present, temp_handle); NineSurface9_CopyDefaultToMem(dest_surface, temp_surface); ID3DPresent_DestroyD3DWindowBuffer(This->present, temp_handle); NineUnknown_Destroy(NineUnknown(temp_surface)); return D3D_OK; }
void NineSwapChain9_dtor( struct NineSwapChain9 *This ) { unsigned i; DBG("This=%p\n", This); if (This->buffers) { for (i = 0; i < This->params.BackBufferCount; i++) NineUnknown_Destroy(NineUnknown(This->buffers[i])); FREE(This->buffers); } if (This->zsbuf) NineUnknown_Destroy(NineUnknown(This->zsbuf)); if (This->present) ID3DPresent_Release(This->present); NineUnknown_dtor(&This->base); }
static void NineVolumeTexture9_dtor( struct NineVolumeTexture9 *This ) { unsigned l; DBG("This=%p\n", This); if (This->volumes) { for (l = 0; l < This->base.base.info.last_level; ++l) NineUnknown_Destroy(&This->volumes[l]->base); FREE(This->volumes); } NineBaseTexture9_dtor(&This->base); }
static void NineTexture9_dtor( struct NineTexture9 *This ) { unsigned l; if (This->surfaces) { /* The surfaces should have 0 references and be unbound now. */ for (l = 0; l <= This->base.base.info.last_level; ++l) NineUnknown_Destroy(&This->surfaces[l]->base.base); FREE(This->surfaces); } if (This->managed_buffer) FREE(This->managed_buffer); NineBaseTexture9_dtor(&This->base); }
static void NineCubeTexture9_dtor( struct NineCubeTexture9 *This ) { unsigned i; DBG("This=%p\n", This); if (This->surfaces) { for (i = 0; i < This->base.base.info.last_level * 6; ++i) NineUnknown_Destroy(&This->surfaces[i]->base.base); FREE(This->surfaces); } if (This->managed_buffer) align_free(This->managed_buffer); NineBaseTexture9_dtor(&This->base); }