static void d3d9_draw( sgui_context* context ) { sgui_d3d9_context* ctx = (sgui_d3d9_context*)context; D3DVIEWPORT9 vp; float m[16]; m[3]=m[7]=m[11]=m[12]=m[13]=0.0f; m[14]=-5.0f; m[15]=1.0f; vp.X=0; vp.Y=0; vp.Width=WIDTH; vp.Height=HEIGHT; vp.MinZ = 0.0f; vp.MaxZ = 1.0f; IDirect3DDevice9_SetViewport( ctx->device, &vp ); IDirect3DDevice9_Clear( ctx->device, 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0, 1.0f, 0 ); vp.Width=WIDTH/2; vp.Height=HEIGHT/2; IDirect3DDevice9_BeginScene( ctx->device ); IDirect3DDevice9_SetRenderState(ctx->device,D3DRS_ZENABLE,TRUE); IDirect3DDevice9_SetFVF( ctx->device, CUSTOMFVF ); IDirect3DDevice9_SetStreamSource( ctx->device, 0, v_buffer, 0, sizeof(CUSTOMVERTEX) ); IDirect3DDevice9_SetRenderState(ctx->device,D3DRS_FILLMODE, D3DFILL_WIREFRAME); m[0]=m[10]=cos(t); m[2]=sin(t); m[8]=-m[2]; m[1]=m[4]=m[6]=m[9]=0; m[5]=1; vp.X = 0; vp.Y = HEIGHT/2; IDirect3DDevice9_SetTransform( ctx->device, D3DTS_VIEW, (D3DMATRIX*)m ); IDirect3DDevice9_SetViewport( ctx->device, &vp ); IDirect3DDevice9_DrawPrimitive( ctx->device, D3DPT_TRIANGLELIST, 0, 12 ); m[1]=m[8]=-sin(t); m[0]=cos(t); m[9]=-m[0]; m[2]=m[4]=m[5]=m[10]=0;m[6]=1; vp.X = WIDTH/2; vp.Y = 0; IDirect3DDevice9_SetTransform( ctx->device, D3DTS_VIEW, (D3DMATRIX*)m ); IDirect3DDevice9_SetViewport( ctx->device, &vp ); IDirect3DDevice9_DrawPrimitive( ctx->device, D3DPT_TRIANGLELIST, 0, 12 ); m[0]=m[10]=-sin(t); m[2]=cos(t); m[8]=-m[2]; m[1]=m[4]=m[6]=m[9]=0;m[5]=1; vp.X = 0; vp.Y = 0; IDirect3DDevice9_SetTransform( ctx->device, D3DTS_VIEW, (D3DMATRIX*)m ); IDirect3DDevice9_SetViewport( ctx->device, &vp ); IDirect3DDevice9_SetRenderState(ctx->device,D3DRS_FILLMODE,D3DFILL_SOLID); IDirect3DDevice9_DrawPrimitive( ctx->device, D3DPT_TRIANGLELIST, 0, 12 ); /* draw GUI in begin/end block */ sgui_ctx_wm_draw_gui( wm ); IDirect3DDevice9_EndScene( ctx->device ); t += 0.01f; }
static int D3D_RenderClear(SDL_Renderer * renderer) { D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata; DWORD color; HRESULT result; if (D3D_ActivateRenderer(renderer) < 0) { return -1; } color = D3DCOLOR_ARGB(renderer->a, renderer->r, renderer->g, renderer->b); /* Don't reset the viewport if we don't have to! */ if (!renderer->viewport.x && !renderer->viewport.y && renderer->viewport.w == data->pparams.BackBufferWidth && renderer->viewport.h == data->pparams.BackBufferHeight) { result = IDirect3DDevice9_Clear(data->device, 0, NULL, D3DCLEAR_TARGET, color, 0.0f, 0); } else { D3DVIEWPORT9 viewport; /* Clear is defined to clear the entire render target */ viewport.X = 0; viewport.Y = 0; viewport.Width = data->pparams.BackBufferWidth; viewport.Height = data->pparams.BackBufferHeight; viewport.MinZ = 0.0f; viewport.MaxZ = 1.0f; IDirect3DDevice9_SetViewport(data->device, &viewport); result = IDirect3DDevice9_Clear(data->device, 0, NULL, D3DCLEAR_TARGET, color, 0.0f, 0); /* Reset the viewport */ viewport.X = renderer->viewport.x; viewport.Y = renderer->viewport.y; viewport.Width = renderer->viewport.w; viewport.Height = renderer->viewport.h; viewport.MinZ = 0.0f; viewport.MaxZ = 1.0f; IDirect3DDevice9_SetViewport(data->device, &viewport); } if (FAILED(result)) { D3D_SetError("Clear()", result); return -1; } return 0; }
void setViewportD3D9(int x, int y, int width, int height) { #ifdef __WIN32__ D3DVIEWPORT9 vp = { x, y, width, height, 0.0f, 1.0f }; IDirect3DDevice9_SetViewport(gDevicePtr, &vp); #endif }
/** @brief Resize Direct3D context on window resize. * @return 1 on success, 0 on failure */ static int resize_d3d(void) { D3DVIEWPORT9 vp = {0, 0, vo_dwidth, vo_dheight, 0, 1}; mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>resize_d3d called.\n"); /* Make sure that backbuffer is large enough to accomodate the new viewport dimensions. Grow it if necessary. */ if (vo_dwidth > priv->cur_backbuf_width || vo_dheight > priv->cur_backbuf_height) { if (!change_d3d_backbuffer(BACKBUFFER_RESET)) return 0; } /* Destroy the OSD textures. They should always match the new dimensions * of the onscreen window, so on each resize we need new OSD dimensions. */ if (priv->d3d_texture_osd) IDirect3DTexture9_Release(priv->d3d_texture_osd); priv->d3d_texture_osd = NULL; if (priv->d3d_texture_system) IDirect3DTexture9_Release(priv->d3d_texture_system); priv->d3d_texture_system = NULL; /* Recreate the OSD. The function will observe that the offscreen plain * surface and the backbuffer are not destroyed and will skip their creation, * effectively recreating only the OSD. */ if (!create_d3d_surfaces()) return 0; if (FAILED(IDirect3DDevice9_SetViewport(priv->d3d_device, &vp))) { mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Setting viewport failed.\n"); return 0; } calc_fs_rect(); #ifdef CONFIG_FREETYPE // font needs to be adjusted force_load_font = 1; #endif // OSD needs to be drawn fresh for new size vo_osd_changed(OSDTYPE_OSD); return 1; }
void d3d_set_viewports(LPDIRECT3DDEVICE dev, D3DVIEWPORT *vp) { #if defined(_XBOX360) D3DDevice_SetViewport(dev, vp); #elif defined(_XBOX1) D3DDevice_SetViewport(vp); #elif defined(HAVE_D3D9) && !defined(__cplusplus) IDirect3DDevice9_SetViewport(dev, vp); #else dev->SetViewport(vp); #endif }
static void device_state_restore(IDirect3DDevice9 *device, struct device_state *state) { unsigned int i; for (i = 0; i < state->num_render_targets; i++) { IDirect3DDevice9_SetRenderTarget(device, i, state->render_targets[i]); if (state->render_targets[i]) IDirect3DSurface9_Release(state->render_targets[i]); state->render_targets[i] = NULL; } IDirect3DDevice9_SetDepthStencilSurface(device, state->depth_stencil); if (state->depth_stencil) { IDirect3DSurface9_Release(state->depth_stencil); state->depth_stencil = NULL; } IDirect3DDevice9_SetViewport(device, &state->viewport); }
/** @brief Configure initial Direct3D context. The first * function called to initialize the D3D context. * @return 1 on success, 0 on failure */ static int configure_d3d(void) { D3DDISPLAYMODE disp_mode; D3DVIEWPORT9 vp = {0, 0, vo_dwidth, vo_dheight, 0, 1}; mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>configure_d3d called.\n"); destroy_d3d_surfaces(); /* Get the current desktop display mode, so we can set up a back buffer * of the same format. */ if (FAILED(IDirect3D9_GetAdapterDisplayMode(priv->d3d_handle, D3DADAPTER_DEFAULT, &disp_mode))) { mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Reading adapter display mode failed.\n"); return 0; } /* Write current Desktop's colorspace format in the global storage. */ priv->desktop_fmt = disp_mode.Format; if (!change_d3d_backbuffer(BACKBUFFER_CREATE)) return 0; if (!create_d3d_surfaces()) return 0; if (FAILED(IDirect3DDevice9_SetViewport(priv->d3d_device, &vp))) { mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Setting viewport failed.\n"); return 0; } calc_fs_rect(); return 1; }
static int D3D_UpdateViewport(SDL_Renderer * renderer) { D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata; D3DVIEWPORT9 viewport; D3DMATRIX matrix; /* Set the viewport */ viewport.X = renderer->viewport.x; viewport.Y = renderer->viewport.y; viewport.Width = renderer->viewport.w; viewport.Height = renderer->viewport.h; viewport.MinZ = 0.0f; viewport.MaxZ = 1.0f; IDirect3DDevice9_SetViewport(data->device, &viewport); /* Set an orthographic projection matrix */ matrix.m[0][0] = 2.0f / renderer->viewport.w; matrix.m[0][1] = 0.0f; matrix.m[0][2] = 0.0f; matrix.m[0][3] = 0.0f; matrix.m[1][0] = 0.0f; matrix.m[1][1] = -2.0f / renderer->viewport.h; matrix.m[1][2] = 0.0f; matrix.m[1][3] = 0.0f; matrix.m[2][0] = 0.0f; matrix.m[2][1] = 0.0f; matrix.m[2][2] = 1.0f; matrix.m[2][3] = 0.0f; matrix.m[3][0] = -1.0f; matrix.m[3][1] = 1.0f; matrix.m[3][2] = 0.0f; matrix.m[3][3] = 1.0f; IDirect3DDevice9_SetTransform(data->device, D3DTS_PROJECTION, &matrix); return 0; }
/** \fn setup \brief Allocate stuff for a given display with/height. It is called again each time the zoom is changed */ bool dxvaRender::setup() { D3DVIEWPORT9 viewPort = {0, 0, displayWidth, displayHeight, 0, 1}; ADM_info("D3D (re)Setting up \n"); D3DPRESENT_PARAMETERS presentationParameters; memset(&presentationParameters, 0, sizeof(presentationParameters)); presentationParameters.Windowed = TRUE; presentationParameters.SwapEffect = D3DSWAPEFFECT_DISCARD; // We could use copy, but discard seems faster according to ms presentationParameters.Flags = D3DPRESENTFLAG_VIDEO; presentationParameters.hDeviceWindow = windowId; presentationParameters.BackBufferWidth = displayWidth; presentationParameters.BackBufferHeight = displayHeight; presentationParameters.MultiSampleType = D3DMULTISAMPLE_NONE; presentationParameters.PresentationInterval = D3DPRESENT_INTERVAL_ONE; presentationParameters.BackBufferFormat = displayMode.Format; presentationParameters.BackBufferCount = 1; presentationParameters.EnableAutoDepthStencil = FALSE; #ifndef REUSE_DEVICE if(ADM_FAILED(IDirect3D9_CreateDevice( d3dHandle, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, presentationParameters.hDeviceWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &presentationParameters, &d3dDevice))) { ADM_warning("Failed to create D3D device\n"); return false; } #else d3dDevice=admD3D::getDevice(); #endif // D3DFORMAT yv12=(D3DFORMAT)MAKEFOURCC('Y','V','1','2'); // if( ADM_FAILED(IDirect3DDevice9_CreateOffscreenPlainSurface( d3dDevice, displayWidth,displayHeight, displayMode.Format, D3DPOOL_DEFAULT, &mySurface, NULL))) { ADM_warning("D3D Cannot create surface\n"); return false; } if( ADM_FAILED(IDirect3DDevice9_CreateOffscreenPlainSurface( d3dDevice, imageWidth,imageHeight, yv12, D3DPOOL_DEFAULT, &myYV12Surface, NULL))) { ADM_warning("D3D Cannot create surface\n"); return false; } // put some defaults IDirect3DDevice9_SetRenderState(d3dDevice, D3DRS_SRCBLEND, D3DBLEND_ONE); IDirect3DDevice9_SetRenderState(d3dDevice, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); IDirect3DDevice9_SetRenderState(d3dDevice, D3DRS_ALPHAFUNC, D3DCMP_GREATER); IDirect3DDevice9_SetRenderState(d3dDevice, D3DRS_ALPHAREF, (DWORD)0x0); IDirect3DDevice9_SetRenderState(d3dDevice, D3DRS_LIGHTING, FALSE); IDirect3DDevice9_SetSamplerState(d3dDevice, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); IDirect3DDevice9_SetSamplerState(d3dDevice, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); // if(ADM_FAILED(IDirect3DDevice9_SetViewport(d3dDevice, &viewPort))) { ADM_warning("D3D Cannot set D3D viewport\n"); return false; } scaler=new ADMColorScalerFull(ADM_CS_BICUBIC,imageWidth,imageHeight,displayWidth,displayHeight, ADM_COLOR_YV12, ADM_COLOR_RGB32A ); videoBuffer=new uint8_t[displayWidth*displayHeight*4]; panScan.left =0; panScan.right =imageWidth-1; panScan.top =0; panScan.bottom=imageHeight-1; targetRect.left =0; targetRect.right =displayWidth-1; targetRect.top =0; targetRect.bottom=displayHeight-1; ADM_info("Setup done\n"); return true; }