[PATCH 2/5] wined3d: Cleanup Get/SetRenderTarget().
Henri Verbeet
hverbeet at codeweavers.com
Wed Aug 4 04:10:24 CDT 2010
---
dlls/wined3d/device.c | 107 ++++++++++++++++++++++++++-----------------------
1 files changed, 57 insertions(+), 50 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index dabc451..f9e65d7 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5571,21 +5571,25 @@ static void WINAPI IWineD3DDeviceImpl_ClearRendertargetView(IWineD3DDevice *ifac
}
/* rendertarget and depth stencil functions */
-static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderTarget(IWineD3DDevice* iface,DWORD RenderTargetIndex, IWineD3DSurface **ppRenderTarget) {
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderTarget(IWineD3DDevice *iface,
+ DWORD render_target_idx, IWineD3DSurface **render_target)
+{
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface;
- if (RenderTargetIndex >= This->adapter->gl_info.limits.buffers)
+ TRACE("iface %p, render_target_idx %u, render_target %p.\n",
+ iface, render_target_idx, render_target);
+
+ if (render_target_idx >= device->adapter->gl_info.limits.buffers)
{
- ERR("(%p) : Only %d render targets are supported.\n",
- This, This->adapter->gl_info.limits.buffers);
+ WARN("Only %u render targets are supported.\n", device->adapter->gl_info.limits.buffers);
return WINED3DERR_INVALIDCALL;
}
- *ppRenderTarget = (IWineD3DSurface *)This->render_targets[RenderTargetIndex];
- TRACE("(%p) : RenderTarget %d Index returning %p\n", This, RenderTargetIndex, *ppRenderTarget);
- /* Note inc ref on returned surface */
- if(*ppRenderTarget != NULL)
- IWineD3DSurface_AddRef(*ppRenderTarget);
+ *render_target = (IWineD3DSurface *)device->render_targets[render_target_idx];
+ if (*render_target) IWineD3DSurface_AddRef(*render_target);
+
+ TRACE("Returning render target %p.\n", *render_target);
+
return WINED3D_OK;
}
@@ -5698,63 +5702,66 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetDepthStencilSurface(IWineD3DDevice
}
}
-static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface, DWORD RenderTargetIndex, IWineD3DSurface *pRenderTarget,
- BOOL set_viewport) {
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface,
+ DWORD render_target_idx, IWineD3DSurface *render_target, BOOL set_viewport)
+{
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface;
- TRACE("(%p) : Setting rendertarget %d to %p\n", This, RenderTargetIndex, pRenderTarget);
+ TRACE("iface %p, render_target_idx %u, render_target %p, set_viewport %#x.\n",
+ iface, render_target_idx, render_target, set_viewport);
- if (RenderTargetIndex >= This->adapter->gl_info.limits.buffers)
+ if (render_target_idx >= device->adapter->gl_info.limits.buffers)
{
- WARN("(%p) : Unsupported target %u set, returning WINED3DERR_INVALIDCALL(only %u supported)\n",
- This, RenderTargetIndex, This->adapter->gl_info.limits.buffers);
+ WARN("Only %u render targets are supported.\n", device->adapter->gl_info.limits.buffers);
return WINED3DERR_INVALIDCALL;
}
+ if (render_target == (IWineD3DSurface *)device->render_targets[render_target_idx])
+ {
+ TRACE("Trying to do a NOP SetRenderTarget operation.\n");
+ return WINED3D_OK;
+ }
+
/* Render target 0 can't be set to NULL. */
- if (!pRenderTarget && !RenderTargetIndex)
+ if (!render_target && !render_target_idx)
{
WARN("Trying to set render target 0 to NULL.\n");
return WINED3DERR_INVALIDCALL;
}
- if (pRenderTarget && !(((IWineD3DSurfaceImpl *)pRenderTarget)->resource.usage & WINED3DUSAGE_RENDERTARGET)) {
- FIXME("(%p)Trying to set the render target to a surface(%p) that wasn't created with a usage of WINED3DUSAGE_RENDERTARGET\n",This ,pRenderTarget);
+ if (render_target && !(((IWineD3DSurfaceImpl *)render_target)->resource.usage & WINED3DUSAGE_RENDERTARGET))
+ {
+ FIXME("Surface %p doesn't have render target usage.\n", render_target);
return WINED3DERR_INVALIDCALL;
}
- /* If we are trying to set what we already have, don't bother */
- if (pRenderTarget == (IWineD3DSurface *)This->render_targets[RenderTargetIndex])
+ if (render_target)
+ IWineD3DSurface_AddRef(render_target);
+ if (device->render_targets[render_target_idx])
+ IWineD3DSurface_Release((IWineD3DSurface *)device->render_targets[render_target_idx]);
+ device->render_targets[render_target_idx] = (IWineD3DSurfaceImpl *)render_target;
+
+ /* Render target 0 is special. */
+ if (!render_target_idx && set_viewport)
{
- TRACE("Trying to do a NOP SetRenderTarget operation\n");
- return WINED3D_OK;
- }
- if (pRenderTarget)
- IWineD3DSurface_AddRef(pRenderTarget);
- if (This->render_targets[RenderTargetIndex])
- IWineD3DSurface_Release((IWineD3DSurface *)This->render_targets[RenderTargetIndex]);
- This->render_targets[RenderTargetIndex] = (IWineD3DSurfaceImpl *)pRenderTarget;
-
- /* Render target 0 is special */
- if(RenderTargetIndex == 0 && set_viewport) {
- /* Finally, reset the viewport and scissor rect as the MSDN states.
- * Tests show that stateblock recording is ignored, the change goes
- * directly into the primary stateblock.
- */
- This->stateBlock->viewport.Height = This->render_targets[0]->currentDesc.Height;
- This->stateBlock->viewport.Width = This->render_targets[0]->currentDesc.Width;
- This->stateBlock->viewport.X = 0;
- This->stateBlock->viewport.Y = 0;
- This->stateBlock->viewport.MaxZ = 1.0f;
- This->stateBlock->viewport.MinZ = 0.0f;
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VIEWPORT);
-
- This->stateBlock->scissorRect.top = 0;
- This->stateBlock->scissorRect.left = 0;
- This->stateBlock->scissorRect.right = This->stateBlock->viewport.Width;
- This->stateBlock->scissorRect.bottom = This->stateBlock->viewport.Height;
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SCISSORRECT);
+ /* Set the viewport and scissor rectangles, if requested. Tests show
+ * that stateblock recording is ignored, the change goes directly
+ * into the primary stateblock. */
+ device->stateBlock->viewport.Height = device->render_targets[0]->currentDesc.Height;
+ device->stateBlock->viewport.Width = device->render_targets[0]->currentDesc.Width;
+ device->stateBlock->viewport.X = 0;
+ device->stateBlock->viewport.Y = 0;
+ device->stateBlock->viewport.MaxZ = 1.0f;
+ device->stateBlock->viewport.MinZ = 0.0f;
+ IWineD3DDeviceImpl_MarkStateDirty(device, STATE_VIEWPORT);
+
+ device->stateBlock->scissorRect.top = 0;
+ device->stateBlock->scissorRect.left = 0;
+ device->stateBlock->scissorRect.right = device->stateBlock->viewport.Width;
+ device->stateBlock->scissorRect.bottom = device->stateBlock->viewport.Height;
+ IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SCISSORRECT);
}
+
return WINED3D_OK;
}
--
1.7.1
More information about the wine-patches
mailing list