VirtualBox

Changeset 30152 in vbox for trunk/src/VBox/Additions/WINNT


Ignore:
Timestamp:
Jun 10, 2010 4:21:59 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
62574
Message:

wddm/3d: bugfixing

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp

    r30144 r30152  
    20492049            Assert(pD3DIfTex);
    20502050            RECT *pRect = NULL;
     2051            bool bNeedResynch = false;
    20512052            Assert(!pData->Flags.RangeValid);
    20522053            Assert(!pData->Flags.BoxValid);
     
    20832084                    }
    20842085
    2085                     ++pLockAlloc->LockInfo.cLocks;
     2086                    bNeedResynch = !pData->Flags.Discard;
    20862087                }
    20872088            }
     
    21012102                }
    21022103                Assert(pLockAlloc->LockInfo.LockedRect.pBits);
    2103             }
    2104 
    2105 
    2106             ++pLockAlloc->LockInfo.cLocks;
    2107 
    2108             if (!pData->Flags.NotifyOnly)
    2109             {
    2110                 pData->pSurfData = pLockAlloc->LockInfo.LockedRect.pBits;
    2111                 pData->Pitch = pLockAlloc->LockInfo.LockedRect.Pitch;
    2112                 pData->SlicePitch = 0;
    2113                 Assert(pLockAlloc->SurfDesc.slicePitch == 0);
    2114                 Assert(!pLockAlloc->pvMem);
    2115             }
    2116             else
    2117             {
    2118                 Assert(pLockAlloc->pvMem);
    2119                 Assert(pRc->RcDesc.enmPool == D3DDDIPOOL_SYSTEMMEM);
    2120                 if (/* !pData->Flags.WriteOnly && */ !pData->Flags.Discard)
    2121                     vboxWddmLockUnlockMemSynch(pLockAlloc, &pLockAlloc->LockInfo.LockedRect, pRect, false /*bool bToLockInfo*/);
     2104
     2105                bNeedResynch = pLockAlloc->LockInfo.fFlags.Discard && !pData->Flags.Discard;
     2106
     2107                Assert(!bNeedResynch);
     2108
     2109                if (/*(pLockAlloc->LockInfo.fFlags.Discard && !pData->Flags.Discard)
     2110                        || */
     2111                        (pLockAlloc->LockInfo.fFlags.ReadOnly && !pData->Flags.ReadOnly))
     2112                {
     2113                    hr = pD3DIfTex->UnlockRect(pData->SubResourceIndex);
     2114                    Assert(hr == S_OK);
     2115                    if (hr == S_OK)
     2116                    {
     2117                        hr = pD3DIfTex->LockRect(pData->SubResourceIndex,
     2118                                &pLockAlloc->LockInfo.LockedRect,
     2119                                pRect,
     2120                                vboxDDI2D3DLockFlags(pData->Flags));
     2121                        Assert(hr == S_OK);
     2122                        pLockAlloc->LockInfo.fFlags.ReadOnly = 0;
     2123                    }
     2124                }
     2125            }
     2126
     2127            if (hr == S_OK)
     2128            {
     2129                ++pLockAlloc->LockInfo.cLocks;
     2130
     2131                if (!pData->Flags.NotifyOnly)
     2132                {
     2133                    pData->pSurfData = pLockAlloc->LockInfo.LockedRect.pBits;
     2134                    pData->Pitch = pLockAlloc->LockInfo.LockedRect.Pitch;
     2135                    pData->SlicePitch = 0;
     2136                    Assert(pLockAlloc->SurfDesc.slicePitch == 0);
     2137                    Assert(!pLockAlloc->pvMem);
     2138                }
     2139                else
     2140                {
     2141                    Assert(pLockAlloc->pvMem);
     2142                    Assert(pRc->RcDesc.enmPool == D3DDDIPOOL_SYSTEMMEM);
     2143
     2144                    if (bNeedResynch)
     2145                        vboxWddmLockUnlockMemSynch(pLockAlloc, &pLockAlloc->LockInfo.LockedRect, pRect, false /*bool bToLockInfo*/);
     2146                }
    21222147            }
    21232148        }
     
    21362161            }
    21372162
    2138             /* else - we lock the entire texture, pRect == NULL */
    2139 
    2140 //            Assert(!pLockAlloc->LockInfo.cLocks);
     2163            /* else - we lock the entire vertex buffer, pRect == NULL */
     2164
     2165            Assert(!pAlloc->LockInfo.cLocks);
    21412166            if (!pAlloc->LockInfo.cLocks)
    21422167            {
     
    21452170                                      &pAlloc->LockInfo.LockedRect.pBits,
    21462171                                      vboxDDI2D3DLockFlags(pData->Flags));
     2172#ifdef VBOXWDDMDISP_WITH_TMPWORKAROUND
     2173                if (pData->Flags.MightDrawFromLocked)
     2174                {
     2175                        RECT r, *pr;
     2176                        if (pRange)
     2177                        {
     2178                            r.top = 0;
     2179                            r.left = pRange->Offset;
     2180                            r.bottom = 1;
     2181                            r.right = pRange->Offset + pRange->Size;
     2182                            pr = &r;
     2183                        }
     2184                        else
     2185                            pr = NULL;
     2186
     2187                        pAlloc->LockInfo.LockedRect.Pitch = pAlloc->SurfDesc.width;
     2188
     2189                        vboxWddmLockUnlockMemSynch(pAlloc, &pAlloc->LockInfo.LockedRect, pr, true /*bool bToLockInfo*/);
     2190                    pD3D9VBuf->Unlock();
     2191                }
     2192#endif
    21472193                Assert(hr == S_OK);
    21482194                if (hr == S_OK)
     
    21622208//                        pAlloc->LockInfo.fFlags.RangeValid = 0;
    21632209                    }
    2164 
    2165                     ++pAlloc->LockInfo.cLocks;
    21662210                }
    21672211            }
     
    21812225            }
    21822226
    2183 
    2184             ++pAlloc->LockInfo.cLocks;
    2185 
    2186             if (!pData->Flags.NotifyOnly)
    2187             {
    2188                 pData->pSurfData = pAlloc->LockInfo.LockedRect.pBits;
    2189                 pData->Pitch = pAlloc->LockInfo.LockedRect.Pitch;
    2190                 pData->SlicePitch = 0;
    2191                 Assert(pAlloc->SurfDesc.slicePitch == 0);
    2192                 Assert(!pAlloc->pvMem);
    2193             }
    2194             else
    2195             {
    2196                 Assert(pAlloc->pvMem);
    2197                 Assert(pRc->RcDesc.enmPool == D3DDDIPOOL_SYSTEMMEM);
    2198                 if (/* !pData->Flags.WriteOnly && */ !pData->Flags.Discard)
    2199                 {
    2200                     RECT r, *pr;
    2201                     if (pRange)
     2227            if (hr == S_OK)
     2228            {
     2229                ++pAlloc->LockInfo.cLocks;
     2230
     2231                if (!pData->Flags.NotifyOnly)
     2232                {
     2233                    pData->pSurfData = pAlloc->LockInfo.LockedRect.pBits;
     2234                    pData->Pitch = pAlloc->LockInfo.LockedRect.Pitch;
     2235                    pData->SlicePitch = 0;
     2236                    Assert(pAlloc->SurfDesc.slicePitch == 0);
     2237                    Assert(!pAlloc->pvMem);
     2238                }
     2239                else
     2240                {
     2241                    Assert(pAlloc->pvMem);
     2242                    Assert(pRc->RcDesc.enmPool == D3DDDIPOOL_SYSTEMMEM);
     2243                    if (/* !pData->Flags.WriteOnly && */ !pData->Flags.Discard)
    22022244                    {
    2203                         r.top = 0;
    2204                         r.left = pRange->Offset;
    2205                         r.bottom = 1;
    2206                         r.right = pRange->Offset + pRange->Size;
    2207                         pr = &r;
     2245                        RECT r, *pr;
     2246                        if (pRange)
     2247                        {
     2248                            r.top = 0;
     2249                            r.left = pRange->Offset;
     2250                            r.bottom = 1;
     2251                            r.right = pRange->Offset + pRange->Size;
     2252                            pr = &r;
     2253                        }
     2254                        else
     2255                            pr = NULL;
     2256                        vboxWddmLockUnlockMemSynch(pAlloc, &pAlloc->LockInfo.LockedRect, pr, false /*bool bToLockInfo*/);
    22082257                    }
    2209                     else
    2210                         pr = NULL;
    2211                     vboxWddmLockUnlockMemSynch(pAlloc, &pAlloc->LockInfo.LockedRect, pr, false /*bool bToLockInfo*/);
    22122258                }
    22132259            }
     
    23222368            Assert(pAlloc->LockInfo.cLocks < UINT32_MAX);
    23232369//            pAlloc->LockInfo.cLocks = 0;
     2370#ifdef VBOXWDDMDISP_WITH_TMPWORKAROUND
     2371            if (!pAlloc->LockInfo.cLocks && !pAlloc->LockInfo.fFlags.MightDrawFromLocked)
     2372#else
    23242373            if (!pAlloc->LockInfo.cLocks)
     2374#endif
    23252375            {
    23262376//                Assert(!pAlloc->LockInfo.cLocks);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette