Stefan Dösinger : wined3d: Create the stateblock in Init3D.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jul 24 07:06:30 CDT 2007
Module: wine
Branch: master
Commit: 861767f036b5ceab17f3b28c1966d3f732fa40b7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=861767f036b5ceab17f3b28c1966d3f732fa40b7
Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date: Sun Jul 22 23:09:11 2007 +0200
wined3d: Create the stateblock in Init3D.
---
dlls/wined3d/device.c | 55 ++++++++++++++++++++++++++++++++---------------
dlls/wined3d/directx.c | 44 --------------------------------------
2 files changed, 37 insertions(+), 62 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 520a4b3..0bdb753 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -202,24 +202,6 @@ static ULONG WINAPI IWineD3DDeviceImpl_Release(IWineD3DDevice *iface) {
/* NOTE: You must release the parent if the object was created via a callback
** ***************************/
- /* Release the update stateblock */
- if(IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->updateStateBlock) > 0){
- if(This->updateStateBlock != This->stateBlock)
- FIXME("(%p) Something's still holding the Update stateblock\n",This);
- }
- This->updateStateBlock = NULL;
- { /* because were not doing proper internal refcounts releasing the primary state block
- causes recursion with the extra checks in ResourceReleased, to avoid this we have
- to set this->stateBlock = NULL; first */
- IWineD3DStateBlock *stateBlock = (IWineD3DStateBlock *)This->stateBlock;
- This->stateBlock = NULL;
-
- /* Release the stateblock */
- if(IWineD3DStateBlock_Release(stateBlock) > 0){
- FIXME("(%p) Something's still holding the Update stateblock\n",This);
- }
- }
-
if (This->resources != NULL ) {
FIXME("(%p) Device released with resources still bound, acceptable but unexpected\n", This);
dumpResources(This->resources);
@@ -1809,6 +1791,24 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, WINED3DPR
/* TODO: Test if OpenGL is compiled in and loaded */
+ TRACE("(%p) : Creating stateblock\n", This);
+ /* Creating the startup stateBlock - Note Special Case: 0 => Don't fill in yet! */
+ hr = IWineD3DDevice_CreateStateBlock(iface,
+ WINED3DSBT_INIT,
+ (IWineD3DStateBlock **)&This->stateBlock,
+ NULL);
+ if (WINED3D_OK != hr) { /* Note: No parent needed for initial internal stateblock */
+ WARN("Failed to create stateblock\n");
+ return hr;
+ }
+ TRACE("(%p) : Created stateblock (%p)\n", This, This->stateBlock);
+ This->updateStateBlock = This->stateBlock;
+ IWineD3DStateBlock_AddRef((IWineD3DStateBlock*)This->updateStateBlock);
+
+ hr = allocate_shader_constants(This->updateStateBlock);
+ if (WINED3D_OK != hr)
+ return hr;
+
/* Initialize the texture unit mapping to a 1:1 mapping */
for (state = 0; state < MAX_COMBINED_SAMPLERS; ++state) {
if (state < GL_LIMITS(fragment_samplers)) {
@@ -1991,6 +1991,25 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, D3DCB_D
This->swapchains = NULL;
This->NumberOfSwapChains = 0;
+ /* Release the update stateblock */
+ if(IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->updateStateBlock) > 0){
+ if(This->updateStateBlock != This->stateBlock)
+ FIXME("(%p) Something's still holding the Update stateblock\n",This);
+ }
+ This->updateStateBlock = NULL;
+
+ { /* because were not doing proper internal refcounts releasing the primary state block
+ causes recursion with the extra checks in ResourceReleased, to avoid this we have
+ to set this->stateBlock = NULL; first */
+ IWineD3DStateBlock *stateBlock = (IWineD3DStateBlock *)This->stateBlock;
+ This->stateBlock = NULL;
+
+ /* Release the stateblock */
+ if(IWineD3DStateBlock_Release(stateBlock) > 0){
+ FIXME("(%p) Something's still holding the Update stateblock\n",This);
+ }
+ }
+
This->d3d_initialized = FALSE;
return WINED3D_OK;
}
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index ae924c4..ebb07bf 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2416,7 +2416,6 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
IWineD3DDeviceImpl *object = NULL;
IWineD3DImpl *This = (IWineD3DImpl *)iface;
HDC hDC;
- HRESULT temp_result;
int i;
/* Validate the adapter number */
@@ -2462,20 +2461,6 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
object->adapterNo = Adapter;
object->devType = DeviceType;
- TRACE("(%p) : Creating stateblock\n", This);
- /* Creating the startup stateBlock - Note Special Case: 0 => Don't fill in yet! */
- if (WINED3D_OK != IWineD3DDevice_CreateStateBlock((IWineD3DDevice *)object,
- WINED3DSBT_INIT,
- (IWineD3DStateBlock **)&object->stateBlock,
- NULL) || NULL == object->stateBlock) { /* Note: No parent needed for initial internal stateblock */
- WARN("Failed to create stateblock\n");
- goto create_device_error;
- }
- TRACE("(%p) : Created stateblock (%p)\n", This, object->stateBlock);
- object->updateStateBlock = object->stateBlock;
- IWineD3DStateBlock_AddRef((IWineD3DStateBlock*)object->updateStateBlock);
- /* Setup surfaces for the backbuffer, frontbuffer and depthstencil buffer */
-
select_shader_mode(&GLINFO_LOCATION, DeviceType, &object->ps_selected_mode, &object->vs_selected_mode);
if (object->ps_selected_mode == SHADER_GLSL || object->vs_selected_mode == SHADER_GLSL) {
object->shader_backend = &glsl_shader_backend;
@@ -2490,10 +2475,6 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
* TODO: move the functionality where it belongs */
select_shader_max_constants(object->ps_selected_mode, object->vs_selected_mode, &GLINFO_LOCATION);
- temp_result = allocate_shader_constants(object->updateStateBlock);
- if (WINED3D_OK != temp_result)
- return temp_result;
-
object->render_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DSurface *) * GL_LIMITS(buffers));
object->fbo_color_attachments = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DSurface *) * GL_LIMITS(buffers));
object->draw_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GLenum) * GL_LIMITS(buffers));
@@ -2512,31 +2493,6 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
list_init(&object->patches[i]);
}
return WINED3D_OK;
-create_device_error:
-
- /* Set the device state to error */
- object->state = WINED3DERR_DRIVERINTERNALERROR;
-
- if (object->updateStateBlock != NULL) {
- IWineD3DStateBlock_Release((IWineD3DStateBlock *)object->updateStateBlock);
- object->updateStateBlock = NULL;
- }
- if (object->stateBlock != NULL) {
- IWineD3DStateBlock_Release((IWineD3DStateBlock *)object->stateBlock);
- object->stateBlock = NULL;
- }
- if (object->render_targets[0] != NULL) {
- IWineD3DSurface_Release(object->render_targets[0]);
- object->render_targets[0] = NULL;
- }
- if (object->stencilBufferTarget != NULL) {
- IWineD3DSurface_Release(object->stencilBufferTarget);
- object->stencilBufferTarget = NULL;
- }
- HeapFree(GetProcessHeap(), 0, object);
- *ppReturnedDeviceInterface = NULL;
- return WINED3DERR_INVALIDCALL;
-
}
#undef GLINFO_LOCATION
More information about the wine-cvs
mailing list