X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fengine%2Fe_graphics.pas;h=5edceb2c5f9d3c754a4d2f2f8e969fcd46410849;hb=c7a5223f1e2520ab13b480b937af1e208201de15;hp=de31fa50ea46797507f03521c0fe58429658926a;hpb=000d1214c24dfa432e38c30b9c1758ca27913cc3;p=d2df-sdl.git diff --git a/src/engine/e_graphics.pas b/src/engine/e_graphics.pas index de31fa5..5edceb2 100644 --- a/src/engine/e_graphics.pas +++ b/src/engine/e_graphics.pas @@ -62,8 +62,9 @@ type procedure e_InitGL(); procedure e_SetViewPort(X, Y, Width, Height: Word); procedure e_ResizeWindow(Width, Height: Integer); -procedure e_ResizeFramebuffer(Width, Height: Integer); +function e_ResizeFramebuffer(Width, Height: Integer): Boolean; procedure e_BlitFramebuffer(WinWidth, WinHeight: Integer); +procedure e_SetRenderTarget(Framebuffer: Boolean); procedure e_Draw(ID: DWORD; X, Y: Integer; Alpha: Byte; AlphaChannel: Boolean; Blending: Boolean; Mirror: TMirrorType = TMirrorType.None); @@ -201,6 +202,7 @@ var //e_SavedTextures: array of TSavedTexture; e_FBO: GLuint = 0; e_RBO: GLuint = 0; + e_RBOSupported: Boolean = True; e_Frame: GLuint = 0; e_FrameW: Integer = -1; e_FrameH: Integer = -1; @@ -379,10 +381,8 @@ begin if Height <> nil then Height^ := e_Textures[ID].tx.Height; end; -procedure e_ResizeFramebuffer(Width, Height: Integer); +procedure DestroyFramebuffer; begin - if e_NoGraphics then Exit; - glBindTexture(GL_TEXTURE_2D, 0); glBindRenderbuffer(GL_RENDERBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0); @@ -404,25 +404,69 @@ begin glDeleteFramebuffers(1, @e_FBO); e_FBO := 0; end; +end; + +function e_ResizeFramebuffer(Width, Height: Integer): Boolean; +begin + Result := False; + + if e_NoGraphics then Exit; + + DestroyFramebuffer; e_FrameW := Width; e_FrameH := Height; + glGetError(); + glGenFramebuffers(1, @e_FBO); + if glGetError() <> GL_NO_ERROR then + begin + e_LogWriteln('GL: glGenFramebuffers failed'); + Exit; + end; + glGenTextures(1, @e_Frame); glBindTexture(GL_TEXTURE_2D, e_Frame); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, nil); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glGenRenderbuffers(1, @e_RBO); - glBindRenderbuffer(GL_RENDERBUFFER, e_RBO); - glRenderbufferStorage(GL_RENDERBUFFER, {$IFNDEF USE_GLES1}GL_DEPTH24_STENCIL8{$ELSE}GL_DEPTH_COMPONENT16{$ENDIF}, Width, Height); + if glGetError() <> GL_NO_ERROR then + begin + e_LogWriteln('GL: can''t create FBO color buffer'); + DestroyFramebuffer; + Exit; + end; glBindFramebuffer(GL_FRAMEBUFFER, e_FBO); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, e_Frame, 0); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, {$IFNDEF USE_GLES1}GL_DEPTH_STENCIL_ATTACHMENT{$ELSE}GL_DEPTH_ATTACHMENT{$ENDIF}, GL_RENDERBUFFER, e_RBO); + if glCheckFramebufferStatus(GL_FRAMEBUFFER) <> GL_FRAMEBUFFER_COMPLETE then + begin + e_LogWriteln('GL: can''t construct framebuffer with color attachment'); + DestroyFramebuffer; + Exit; + end; + +{$IFNDEF USE_GLES1} + if e_RBOSupported then + begin + glGenRenderbuffers(1, @e_RBO); + glBindRenderbuffer(GL_RENDERBUFFER, e_RBO); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, Width, Height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, e_RBO); + if glCheckFramebufferStatus(GL_FRAMEBUFFER) <> GL_FRAMEBUFFER_COMPLETE then + begin + e_LogWriteln('GL: can''t construct framebuffer with depth+stencil attachment, trying without'); + e_RBOSupported := False; + Result := e_ResizeFramebuffer(Width, Height); + Exit; + end; + end; +{$ENDIF} + + Result := True; end; procedure e_ResizeWindow(Width, Height: Integer); @@ -447,15 +491,22 @@ begin glTexCoord2f(u, v); glVertex2i(x1, y0); end; +procedure e_SetRenderTarget(Framebuffer: Boolean); +begin + if (e_FBO = 0) or e_NoGraphics then exit; + if Framebuffer then + glBindFramebuffer(GL_FRAMEBUFFER, e_FBO) + else + glBindFramebuffer(GL_FRAMEBUFFER, 0); +end; + procedure e_BlitFramebuffer(WinWidth, WinHeight: Integer); begin if (e_FBO = 0) or (e_Frame = 0) or e_NoGraphics then exit; glDisable(GL_BLEND); glEnable(GL_TEXTURE_2D); - glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindTexture(GL_TEXTURE_2D, e_Frame); - e_SetViewPort(0, 0, WinWidth, WinHeight); glColor4ub(255, 255, 255, 255); glBegin(GL_QUADS); @@ -464,9 +515,6 @@ begin glTexCoord2f(1, 0); glVertex2i(WinWidth, WinHeight); glTexCoord2f(1, 1); glVertex2i(WinWidth, 0); glEnd(); - - glBindFramebuffer(GL_FRAMEBUFFER, e_FBO); - e_SetViewPort(0, 0, e_FrameW, e_FrameH); end; procedure e_Draw(ID: DWORD; X, Y: Integer; Alpha: Byte; AlphaChannel: Boolean;