HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShader(LPDIRECT3DDEVICE9EX iface, IDirect3DVertexShader9** ppShader) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; IWineD3DVertexShader *pShader; HRESULT hrc = D3D_OK; TRACE("iface %p, shader %p.\n", iface, ppShader); wined3d_mutex_lock(); hrc = IWineD3DDevice_GetVertexShader(This->WineD3DDevice, &pShader); if (SUCCEEDED(hrc)) { if (pShader) { hrc = IWineD3DVertexShader_GetParent(pShader, (IUnknown **)ppShader); IWineD3DVertexShader_Release(pShader); } else { *ppShader = NULL; } } else { WARN("(%p) : Call to IWineD3DDevice_GetVertexShader failed %u (device %p)\n", This, hrc, This->WineD3DDevice); } wined3d_mutex_unlock(); TRACE("(%p) : returning %p\n", This, *ppShader); return hrc; }
HRESULT WINAPI IDirect3DDevice9Impl_GetVertexShader(LPDIRECT3DDEVICE9EX iface, IDirect3DVertexShader9** ppShader) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; IWineD3DVertexShader *pShader; HRESULT hrc = D3D_OK; TRACE("(%p) : Relay device@%p\n", This, This->WineD3DDevice); EnterCriticalSection(&d3d9_cs); hrc = IWineD3DDevice_GetVertexShader(This->WineD3DDevice, &pShader); if (SUCCEEDED(hrc)) { if (pShader) { hrc = IWineD3DVertexShader_GetParent(pShader, (IUnknown **)ppShader); IWineD3DVertexShader_Release(pShader); } else { *ppShader = NULL; } } else { WARN("(%p) : Call to IWineD3DDevice_GetVertexShader failed %u (device %p)\n", This, hrc, This->WineD3DDevice); } LeaveCriticalSection(&d3d9_cs); TRACE("(%p) : returning %p\n", This, *ppShader); return hrc; }
SHADERDECL(int) ShaderSetVertexShader(void *pShaderContext, void *pShaderObj) { IWineD3DDeviceImpl *This; IWineD3DVertexShader* pShader; IWineD3DVertexShader* oldShader; SHADER_SET_CURRENT_CONTEXT(pShaderContext); This = g_pCurrentContext->pDeviceContext; pShader = (IWineD3DVertexShader* )pShaderObj; oldShader = This->updateStateBlock->vertexShader; if(oldShader == pShader) { /* Checked here to allow proper stateblock recording */ Log(("App is setting the old shader over, nothing to do\n")); return VINF_SUCCESS; } This->updateStateBlock->vertexShader = pShader; This->updateStateBlock->changed.vertexShader = TRUE; Log(("(%p) : setting pShader(%p)\n", This, pShader)); if(pShader) IWineD3DVertexShader_AddRef(pShader); if(oldShader) IWineD3DVertexShader_Release(oldShader); g_pCurrentContext->fChangedVertexShader = true; g_pCurrentContext->fChangedVertexShaderConstant = true; /* force constant reload. */ return VINF_SUCCESS; }
static ULONG STDMETHODCALLTYPE d3d10_vertex_shader_Release(ID3D10VertexShader *iface) { struct d3d10_vertex_shader *This = (struct d3d10_vertex_shader *)iface; ULONG refcount = InterlockedDecrement(&This->refcount); TRACE("%p decreasing refcount to %u\n", This, refcount); if (!refcount) { IWineD3DVertexShader_Release(This->wined3d_shader); } return refcount; }
static ULONG WINAPI IDirect3DVertexShader9Impl_Release(LPDIRECT3DVERTEXSHADER9 iface) { IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { EnterCriticalSection(&d3d9_cs); IWineD3DVertexShader_Release(This->wineD3DVertexShader); LeaveCriticalSection(&d3d9_cs); IDirect3DDevice9Ex_Release(This->parentDevice); HeapFree(GetProcessHeap(), 0, This); } return ref; }
static ULONG WINAPI IDirect3DVertexShader9Impl_Release(LPDIRECT3DVERTEXSHADER9 iface) { IDirect3DVertexShader9Impl *This = (IDirect3DVertexShader9Impl *)iface; ULONG ref = InterlockedDecrement(&This->ref); TRACE("%p decreasing refcount to %u.\n", iface, ref); if (ref == 0) { IDirect3DDevice9Ex *parentDevice = This->parentDevice; wined3d_mutex_lock(); IWineD3DVertexShader_Release(This->wineD3DVertexShader); wined3d_mutex_unlock(); /* Release the device last, as it may cause the device to be destroyed. */ IDirect3DDevice9Ex_Release(parentDevice); } return ref; }