@@ -3526,15 +3526,13 @@ HRESULT m_IDirectDrawSurfaceX::SetSurfaceDesc2(LPDDSURFACEDESC2 lpDDSurfaceDesc2
35263526 {
35273527 Flag = Flag || (surfaceDesc2.dwWidth != lpDDSurfaceDesc2->dwWidth );
35283528 SurfaceFlags &= ~DDSD_WIDTH;
3529- ResetDisplayFlags &= ~DDSD_WIDTH;
35303529 surfaceDesc2.dwFlags |= DDSD_WIDTH;
35313530 surfaceDesc2.dwWidth = lpDDSurfaceDesc2->dwWidth ;
35323531 }
35333532 if ((SurfaceFlags & DDSD_HEIGHT) && lpDDSurfaceDesc2->dwHeight )
35343533 {
35353534 Flag = Flag || (surfaceDesc2.dwHeight != lpDDSurfaceDesc2->dwHeight );
35363535 SurfaceFlags &= ~DDSD_HEIGHT;
3537- ResetDisplayFlags &= ~DDSD_HEIGHT;
35383536 surfaceDesc2.dwFlags |= DDSD_HEIGHT;
35393537 surfaceDesc2.dwHeight = lpDDSurfaceDesc2->dwHeight ;
35403538 }
@@ -5077,89 +5075,100 @@ void m_IDirectDrawSurfaceX::UpdateSurfaceDesc()
50775075{
50785076 // Get surface flags
50795077 bool IsChanged = false ;
5080- DWORD Flags = surfaceDesc2.dwFlags ;
5081- if (ShouldResetDisplayFlags)
50825078 {
5083- Flags &= ~ResetDisplayFlags;
5084- }
5085-
5086- // Add missing flags
5087- if (SUCCEEDED (CheckInterface (__FUNCTION__, false , false , false )) &&
5088- ((Flags & (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT)) != (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT) ||
5089- ((Flags & DDSD_REFRESHRATE) && !surfaceDesc2.dwRefreshRate )))
5090- {
5091- // Get resolution
5092- DWORD Width, Height, RefreshRate, BPP;
5093- ddrawParent->GetSurfaceDisplay (Width, Height, BPP, RefreshRate);
5094-
5095- // Set Height and Width
5096- if (Width && Height &&
5097- (Flags & (DDSD_WIDTH | DDSD_HEIGHT)) != (DDSD_WIDTH | DDSD_HEIGHT))
5079+ DWORD Flags = surfaceDesc2.dwFlags ;
5080+ if (ShouldResetDisplayFlags)
50985081 {
5099- ResetDisplayFlags |= DDSD_WIDTH | DDSD_HEIGHT;
5100- Flags |= DDSD_WIDTH | DDSD_HEIGHT;
5101- surfaceDesc2.dwWidth = Width;
5102- surfaceDesc2.dwHeight = Height;
5103- surfaceDesc2.lPitch = 0 ;
5104- IsChanged = true ;
5082+ Flags &= ~ResetDisplayFlags;
51055083 }
5106- // Set Refresh Rate
5107- if (RefreshRate && ((Flags & DDSD_REFRESHRATE) || IsPrimaryOrBackBuffer ()))
5108- {
5109- Flags |= DDSD_REFRESHRATE;
5110- surfaceDesc2.dwRefreshRate = RefreshRate;
5111- }
5112- // Set PixelFormat
5113- if (BPP && !(Flags & DDSD_PIXELFORMAT))
5114- {
5115- ResetDisplayFlags |= DDSD_PIXELFORMAT;
5116- Flags |= DDSD_PIXELFORMAT;
5117- ddrawParent->GetDisplayPixelFormat (surfaceDesc2.ddpfPixelFormat , BPP);
5118- surfaceDesc2.lPitch = 0 ;
5119- IsChanged = true ;
5120- }
5121- // Reset MipMap level pitch
5122- if (IsChanged && MipMaps.size ())
5084+
5085+ // Add missing flags
5086+ if (SUCCEEDED (CheckInterface (__FUNCTION__, false , false , false )) &&
5087+ ((Flags & (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT)) != (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT) ||
5088+ ((Flags & DDSD_REFRESHRATE) && !surfaceDesc2.dwRefreshRate )))
51235089 {
5124- for (auto & entry : MipMaps)
5090+ // Get resolution
5091+ DWORD Width, Height, RefreshRate, BPP;
5092+ ddrawParent->GetSurfaceDisplay (Width, Height, BPP, RefreshRate);
5093+
5094+ // Set Height and Width
5095+ if (Width && Height &&
5096+ (Flags & (DDSD_WIDTH | DDSD_HEIGHT)) != (DDSD_WIDTH | DDSD_HEIGHT))
51255097 {
5126- entry.dwWidth = 0 ;
5127- entry.dwHeight = 0 ;
5128- entry.lPitch = 0 ;
5098+ ResetDisplayFlags |= DDSD_WIDTH | DDSD_HEIGHT;
5099+ Flags |= DDSD_WIDTH | DDSD_HEIGHT;
5100+ surfaceDesc2.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT;
5101+ surfaceDesc2.dwWidth = Width;
5102+ surfaceDesc2.dwHeight = Height;
5103+ surfaceDesc2.lPitch = 0 ;
5104+ IsChanged = true ;
51295105 }
5106+ // Set Refresh Rate
5107+ if (RefreshRate && ((Flags & DDSD_REFRESHRATE) || IsPrimaryOrBackBuffer ()))
5108+ {
5109+ Flags |= DDSD_REFRESHRATE;
5110+ surfaceDesc2.dwFlags |= DDSD_REFRESHRATE;
5111+ surfaceDesc2.dwRefreshRate = RefreshRate;
5112+ }
5113+ // Set PixelFormat
5114+ if (BPP && !(Flags & DDSD_PIXELFORMAT))
5115+ {
5116+ ResetDisplayFlags |= DDSD_PIXELFORMAT;
5117+ Flags |= DDSD_PIXELFORMAT;
5118+ surfaceDesc2.dwFlags |= DDSD_PIXELFORMAT;
5119+ ddrawParent->GetDisplayPixelFormat (surfaceDesc2.ddpfPixelFormat , BPP);
5120+ surfaceDesc2.lPitch = 0 ;
5121+ IsChanged = true ;
5122+ }
5123+ // Reset MipMap level pitch
5124+ if (IsChanged && MipMaps.size ())
5125+ {
5126+ for (auto & entry : MipMaps)
5127+ {
5128+ entry.dwWidth = 0 ;
5129+ entry.dwHeight = 0 ;
5130+ entry.lPitch = 0 ;
5131+ }
5132+ }
5133+ }
5134+
5135+ // Clear reset flag
5136+ if ((Flags & ResetDisplayFlags) == ResetDisplayFlags)
5137+ {
5138+ ShouldResetDisplayFlags = false ;
51305139 }
51315140 }
51325141 // Remove surface memory pointer
51335142 if (!surface.UsingSurfaceMemory )
51345143 {
5135- Flags &= ~DDSD_LPSURFACE;
5144+ surfaceDesc2. dwFlags &= ~DDSD_LPSURFACE;
51365145 surfaceDesc2.lpSurface = nullptr ;
51375146 }
51385147 // Unset lPitch
5139- if ((((Flags & (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT)) != (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT) ||
5140- !(Flags & DDSD_PITCH)) && !(Flags & DDSD_LINEARSIZE)) || !surfaceDesc2.lPitch )
5148+ if ((((surfaceDesc2. dwFlags & (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT)) != (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT) ||
5149+ !(surfaceDesc2. dwFlags & DDSD_PITCH)) && !(surfaceDesc2. dwFlags & DDSD_LINEARSIZE)) || !surfaceDesc2.lPitch )
51415150 {
5142- Flags &= ~(DDSD_PITCH | DDSD_LINEARSIZE);
5151+ surfaceDesc2. dwFlags &= ~(DDSD_PITCH | DDSD_LINEARSIZE);
51435152 surfaceDesc2.lPitch = 0 ;
51445153 }
51455154 // Set lPitch
5146- if ((Flags & (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT)) == (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT) &&
5147- !(Flags & DDSD_LINEARSIZE) && !(Flags & DDSD_PITCH))
5155+ if ((surfaceDesc2. dwFlags & (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT)) == (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT) &&
5156+ !(surfaceDesc2. dwFlags & DDSD_LINEARSIZE) && !(surfaceDesc2. dwFlags & DDSD_PITCH))
51485157 {
51495158 DWORD Pitch = ComputePitch (GetDisplayFormat (surfaceDesc2.ddpfPixelFormat ), surfaceDesc2.dwWidth , surfaceDesc2.dwHeight );
51505159 if (Pitch)
51515160 {
5152- Flags |= DDSD_PITCH;
5161+ surfaceDesc2. dwFlags |= DDSD_PITCH;
51535162 surfaceDesc2.lPitch = Pitch;
51545163 }
51555164 }
51565165 // Set surface format
5157- if (surface.Format == D3DFMT_UNKNOWN && (Flags & DDSD_PIXELFORMAT))
5166+ if (surface.Format == D3DFMT_UNKNOWN && (surfaceDesc2. dwFlags & DDSD_PIXELFORMAT))
51585167 {
51595168 surface.Format = GetDisplayFormat (surfaceDesc2.ddpfPixelFormat );
51605169 }
51615170 // Set attached stencil surface size
5162- if (IsChanged && (Flags & (DDSD_WIDTH | DDSD_HEIGHT)) == (DDSD_WIDTH | DDSD_HEIGHT))
5171+ if (IsChanged && (surfaceDesc2. dwFlags & (DDSD_WIDTH | DDSD_HEIGHT)) == (DDSD_WIDTH | DDSD_HEIGHT))
51635172 {
51645173 m_IDirectDrawSurfaceX* lpAttachedSurfaceX = GetAttachedDepthStencil ();
51655174 if (lpAttachedSurfaceX && (surfaceDesc2.dwWidth != lpAttachedSurfaceX->surfaceDesc2 .dwWidth ||
@@ -5176,15 +5185,6 @@ void m_IDirectDrawSurfaceX::UpdateSurfaceDesc()
51765185 }
51775186 }
51785187 }
5179-
5180- // Add flags to surface desc
5181- surfaceDesc2.dwFlags |= Flags;
5182-
5183- // Clear reset flag
5184- if ((Flags & ResetDisplayFlags) == ResetDisplayFlags)
5185- {
5186- ShouldResetDisplayFlags = false ;
5187- }
51885188}
51895189
51905190void m_IDirectDrawSurfaceX::SetAsRenderTarget ()
0 commit comments