[Scummvm-git-logs] scummvm master -> 2368991ab6567174b7e55c995fdb4bc6016572b3

aquadran noreply at scummvm.org
Tue Dec 7 18:58:10 UTC 2021


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
2368991ab6 TINYGL: Rearrange access gl context access from/to frame buffer class


Commit: 2368991ab6567174b7e55c995fdb4bc6016572b3
    https://github.com/scummvm/scummvm/commit/2368991ab6567174b7e55c995fdb4bc6016572b3
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2021-12-07T19:58:03+01:00

Commit Message:
TINYGL: Rearrange access gl context access from/to frame buffer class

Changed paths:
    graphics/tinygl/api.cpp
    graphics/tinygl/clip.cpp
    graphics/tinygl/get.cpp
    graphics/tinygl/init.cpp
    graphics/tinygl/misc.cpp
    graphics/tinygl/zblit.cpp
    graphics/tinygl/zblit.h
    graphics/tinygl/zbuffer.cpp
    graphics/tinygl/zbuffer.h
    graphics/tinygl/zdirtyrect.cpp
    graphics/tinygl/zdirtyrect.h
    graphics/tinygl/zgl.h
    graphics/tinygl/ztriangle.cpp


diff --git a/graphics/tinygl/api.cpp b/graphics/tinygl/api.cpp
index 009ab24a5f..019adf5981 100644
--- a/graphics/tinygl/api.cpp
+++ b/graphics/tinygl/api.cpp
@@ -730,12 +730,12 @@ void tglDebug(int mode) {
 
 void tglSetShadowMaskBuf(unsigned char *buf) {
 	TinyGL::GLContext *c = TinyGL::gl_get_context();
-	c->fb->shadow_mask_buf = buf;
+	c->shadow_mask_buf = buf;
 }
 
 void tglSetShadowColor(unsigned char r, unsigned char g, unsigned char b) {
 	TinyGL::GLContext *c = TinyGL::gl_get_context();
-	c->fb->shadow_color_r = r << 8;
-	c->fb->shadow_color_g = g << 8;
-	c->fb->shadow_color_b = b << 8;
+	c->shadow_color_r = r << 8;
+	c->shadow_color_g = g << 8;
+	c->shadow_color_b = b << 8;
 }
diff --git a/graphics/tinygl/clip.cpp b/graphics/tinygl/clip.cpp
index 249f5c5118..1db02fc7cf 100644
--- a/graphics/tinygl/clip.cpp
+++ b/graphics/tinygl/clip.cpp
@@ -400,10 +400,10 @@ void GLContext::gl_draw_triangle_fill(GLContext *c, GLVertex *p0, GLVertex *p1,
 		c->fb->fillTriangleDepthOnly(&p0->zp, &p1->zp, &p2->zp);
 	}
 	if (c->shadow_mode & 1) {
-		assert(c->fb->shadow_mask_buf);
+		assert(c->shadow_mask_buf);
 		c->fb->fillTriangleFlatShadowMask(&p0->zp, &p1->zp, &p2->zp);
 	} else if (c->shadow_mode & 2) {
-		assert(c->fb->shadow_mask_buf);
+		assert(c->shadow_mask_buf);
 		c->fb->fillTriangleFlatShadow(&p0->zp, &p1->zp, &p2->zp);
 	} else if (c->texture_2d_enabled && c->current_texture && c->current_texture->images[0].pixmap) {
 #ifdef TINYGL_PROFILE
diff --git a/graphics/tinygl/get.cpp b/graphics/tinygl/get.cpp
index c3d548d54d..6fd3c24c07 100644
--- a/graphics/tinygl/get.cpp
+++ b/graphics/tinygl/get.cpp
@@ -57,10 +57,10 @@ void tglGetIntegerv(int pname, int *params) {
 		*params = MAX_TEXTURE_STACK_DEPTH;
 		break;
 	case TGL_BLEND:
-		*params = c->fb->isBlendingEnabled();
+		*params = c->blending_enabled;
 		break;
 	case TGL_ALPHA_TEST:
-		*params = c->fb->isAlphaTestEnabled();
+		*params = c->alpha_test_enabled;
 		break;
 	default:
 		error("tglGet: option not implemented");
diff --git a/graphics/tinygl/init.cpp b/graphics/tinygl/init.cpp
index 0cecd92ed6..eda9131a62 100644
--- a/graphics/tinygl/init.cpp
+++ b/graphics/tinygl/init.cpp
@@ -95,7 +95,6 @@ void GLContext::init(int screenW, int screenH, Graphics::PixelFormat pixelFormat
 	initSharedState();
 
 	// lists
-
 	exec_flag = 1;
 	compile_flag = 0;
 	print_flag = 0;
@@ -179,10 +178,13 @@ void GLContext::init(int screenW, int screenH, Graphics::PixelFormat pixelFormat
 	name_stack_size = 0;
 
 	// blending
-	fb->enableBlending(false);
+	blending_enabled = false;
 
 	// alpha test
-	fb->enableAlphaTest(false);
+	alpha_test_enabled = false;
+
+	// depth test
+	depth_test = false;
 
 	// matrix
 	matrix_mode = 0;
@@ -230,9 +232,6 @@ void GLContext::init(int screenW, int screenH, Graphics::PixelFormat pixelFormat
 	specbuf_used_counter = 0;
 	specbuf_num_buffers = 0;
 
-	// depth test
-	depth_test = 0;
-
 	color_mask = (1 << 24) | (1 << 16) | (1 << 8) | (1 << 0);
 
 	const int kDrawCallMemory = 5 * 1024 * 1024;
diff --git a/graphics/tinygl/misc.cpp b/graphics/tinygl/misc.cpp
index 5c0f98d534..fca6758b55 100644
--- a/graphics/tinygl/misc.cpp
+++ b/graphics/tinygl/misc.cpp
@@ -87,13 +87,12 @@ void GLContext::glopEnableDisable(GLParam *p) {
 		break;
 	case TGL_DEPTH_TEST:
 		depth_test = v;
-		fb->enableDepthTest(v);
 		break;
 	case TGL_ALPHA_TEST:
-		fb->enableAlphaTest(v);
+		alpha_test_enabled = v;
 		break;
 	case TGL_BLEND:
-		fb->enableBlending(v);
+		blending_enabled = v;
 		break;
 	case TGL_POLYGON_OFFSET_FILL:
 		if (v)
@@ -136,20 +135,17 @@ void GLContext::glopEnableDisable(GLParam *p) {
 }
 
 void GLContext::glopBlendFunc(GLParam *p) {
-	TGLenum sfactor = p[1].i;
-	TGLenum dfactor = p[2].i;
-	fb->setBlendingFactors(sfactor, dfactor);
+	source_blending_factor = p[1].i;
+	destination_blending_factor = p[2].i;
 }
 
 void GLContext::glopAlphaFunc(GLParam *p) {
-	TGLenum func = p[1].i;
-	float ref = p[2].f;
-	fb->setAlphaTestFunc(func, (int)(ref * 255));
+	alpha_test_func = p[1].i;
+	alpha_test_ref_val = (int)(p[2].f * 255);
 }
 
 void GLContext::glopDepthFunc(GLParam *p) {
-	TGLenum func = p[1].i;
-	fb->setDepthFunc(func);
+	depth_func = p[1].i;
 }
 
 void GLContext::glopShadeModel(GLParam *p) {
@@ -200,8 +196,8 @@ void GLContext::glopColorMask(GLParam *p) {
 	color_mask = p[1].i;
 }
 
-void GLContext::glopDepthMask(TinyGL::GLParam *p) {
-	fb->enableDepthWrite(p[1].i);
+void GLContext::glopDepthMask(GLParam *p) {
+	depth_write = p[1].i;
 }
 
 } // end of namespace TinyGL
diff --git a/graphics/tinygl/zblit.cpp b/graphics/tinygl/zblit.cpp
index 8db4747926..76abdeecd7 100644
--- a/graphics/tinygl/zblit.cpp
+++ b/graphics/tinygl/zblit.cpp
@@ -314,8 +314,8 @@ namespace TinyGL {
 // This blit only supports tinting but it will fall back to simpleBlit
 // if flipping is required (or anything more complex than that, including rotationd and scaling).
 template <bool kDisableColoring, bool kDisableBlending, bool kEnableAlphaBlending>
-FORCEINLINE void TinyGL::BlitImage::tglBlitRLE(int dstX, int dstY, int srcX, int srcY, int srcWidth, int srcHeight, float aTint, float rTint, float gTint, float bTint) {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
+FORCEINLINE void BlitImage::tglBlitRLE(int dstX, int dstY, int srcX, int srcY, int srcWidth, int srcHeight, float aTint, float rTint, float gTint, float bTint) {
+	GLContext *c = gl_get_context();
 
 	int clampWidth, clampHeight;
 	int width = srcWidth, height = srcHeight;
@@ -404,8 +404,8 @@ FORCEINLINE void TinyGL::BlitImage::tglBlitRLE(int dstX, int dstY, int srcX, int
 
 // This blit function is called when flipping is needed but transformation isn't.
 template <bool kDisableBlending, bool kDisableColoring, bool kFlipVertical, bool kFlipHorizontal>
-FORCEINLINE void TinyGL::BlitImage::tglBlitSimple(int dstX, int dstY, int srcX, int srcY, int srcWidth, int srcHeight, float aTint, float rTint, float gTint, float bTint) {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
+FORCEINLINE void BlitImage::tglBlitSimple(int dstX, int dstY, int srcX, int srcY, int srcWidth, int srcHeight, float aTint, float rTint, float gTint, float bTint) {
+	GLContext *c = gl_get_context();
 
 	int clampWidth, clampHeight;
 	int width = srcWidth, height = srcHeight;
@@ -457,9 +457,9 @@ FORCEINLINE void TinyGL::BlitImage::tglBlitSimple(int dstX, int dstY, int srcX,
 // This function is called when scale is needed: it uses a simple nearest
 // filter to scale the blit image before copying it to the screen.
 template <bool kDisableBlending, bool kDisableColoring, bool kFlipVertical, bool kFlipHorizontal>
-FORCEINLINE void TinyGL::BlitImage::tglBlitScale(int dstX, int dstY, int width, int height, int srcX, int srcY, int srcWidth, int srcHeight,
+FORCEINLINE void BlitImage::tglBlitScale(int dstX, int dstY, int width, int height, int srcX, int srcY, int srcWidth, int srcHeight,
 					 float aTint, float rTint, float gTint, float bTint) {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
+	GLContext *c = gl_get_context();
 
 	int clampWidth, clampHeight;
 	if (clipBlitImage(c, srcX, srcY, srcWidth, srcHeight, width, height, dstX, dstY, clampWidth, clampHeight) == false)
@@ -546,9 +546,9 @@ systems.
 */
 
 template <bool kDisableBlending, bool kDisableColoring, bool kFlipVertical, bool kFlipHorizontal>
-FORCEINLINE void TinyGL::BlitImage::tglBlitRotoScale(int dstX, int dstY, int width, int height, int srcX, int srcY, int srcWidth, int srcHeight, int rotation,
+FORCEINLINE void BlitImage::tglBlitRotoScale(int dstX, int dstY, int width, int height, int srcX, int srcY, int srcWidth, int srcHeight, int rotation,
 							 int originX, int originY, float aTint, float rTint, float gTint, float bTint) {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
+	GLContext *c = gl_get_context();
 
 	int clampWidth, clampHeight;
 	if (clipBlitImage(c, srcX, srcY, srcWidth, srcHeight, width, height, dstX, dstY, clampWidth, clampHeight) == false)
@@ -710,8 +710,8 @@ void tglBlit(BlitImage *blitImage, const BlitTransform &transform) {
 	GLContext *c = gl_get_context();
 	bool disableColor = transform._aTint == 1.0f && transform._bTint == 1.0f && transform._gTint == 1.0f && transform._rTint == 1.0f;
 	bool disableTransform = transform._destinationRectangle.width() == 0 && transform._destinationRectangle.height() == 0 && transform._rotation == 0;
-	bool disableBlend = c->fb->isBlendingEnabled() == false;
-	bool enableAlphaBlending = c->fb->isAlphaBlendingEnabled();
+	bool disableBlend = c->blending_enabled == false;
+	bool enableAlphaBlending = c->source_blending_factor == TGL_SRC_ALPHA && c->destination_blending_factor == TGL_ONE_MINUS_SRC_ALPHA;
 
 	if (enableAlphaBlending) {
 		tglBlit<true>(blitImage, transform, disableColor, disableTransform, disableBlend);
@@ -756,7 +756,7 @@ void tglBlitSetScissorRect(const Common::Rect &rect) {
 	gl_get_context()->_scissorRect = rect;
 }
 
-void tglBlitResetScissorRect(void) {
+void tglBlitResetScissorRect() {
 	GLContext *c = gl_get_context();
 	c->_scissorRect = c->renderRect;
 }
diff --git a/graphics/tinygl/zblit.h b/graphics/tinygl/zblit.h
index 8196d1976e..7ffc4993d2 100644
--- a/graphics/tinygl/zblit.h
+++ b/graphics/tinygl/zblit.h
@@ -175,15 +175,15 @@ namespace Internal {
 	void tglCleanupImages(); // This function checks if any blit image is to be cleaned up and deletes it.
 
 	// Documentation for those is the same as the one before, only those function are the one that actually execute the correct code path.
-	void tglBlit(TinyGL::BlitImage *blitImage, const TinyGL::BlitTransform &transform);
+	void tglBlit(BlitImage *blitImage, const BlitTransform &transform);
 
 	// Disables blending explicitly.
-	void tglBlitNoBlend(TinyGL::BlitImage *blitImage, const TinyGL::BlitTransform &transform);
+	void tglBlitNoBlend(BlitImage *blitImage, const BlitTransform &transform);
 
 	// Disables blending, transforms and tinting.
-	void tglBlitFast(TinyGL::BlitImage *blitImage, int x, int y);
+	void tglBlitFast(BlitImage *blitImage, int x, int y);
 
-	void tglBlitZBuffer(TinyGL::BlitImage *blitImage, int x, int y);
+	void tglBlitZBuffer(BlitImage *blitImage, int x, int y);
 
 	/**
 	@brief Sets up a scissor rectangle for blit calls: every blit call is affected by this rectangle.
diff --git a/graphics/tinygl/zbuffer.cpp b/graphics/tinygl/zbuffer.cpp
index ac1f370b43..742777d64b 100644
--- a/graphics/tinygl/zbuffer.cpp
+++ b/graphics/tinygl/zbuffer.cpp
@@ -80,66 +80,23 @@ void memset_l(void *adr, int val, int count) {
 		*p++ = val;
 }
 
-FrameBuffer::FrameBuffer(int width, int height, const Graphics::PixelBuffer &frame_buffer) : _depthWrite(true), _enableScissor(false) {
-	this->xsize = width;
-	this->ysize = height;
-	this->cmode = frame_buffer.getFormat();
-	this->pixelbytes = this->cmode.bytesPerPixel;
-	this->linesize = (xsize * this->pixelbytes + 3) & ~3;
-
-	int size = this->xsize * this->ysize * sizeof(unsigned int);
-
-	this->_zbuf = (unsigned int *)gl_zalloc(size);
-
-	this->frame_buffer_allocated = 0;
-	this->pbuf = frame_buffer;
-
-	this->current_texture = NULL;
-	this->shadow_mask_buf = NULL;
-
-	this->buffer.pbuf = this->pbuf.getRawBuffer();
-	this->buffer.zbuf = this->_zbuf;
-	_blendingEnabled = false;
-	_alphaTestEnabled = false;
-	_depthTestEnabled = false;
-	_depthFunc = TGL_LESS;
-	_offsetStates = 0;
-	_offsetFactor = 0.0f;
-	_offsetUnits = 0.0f;
-}
-
-FrameBuffer::FrameBuffer(int width, int height, const Graphics::PixelFormat &format) : _depthWrite(true), _enableScissor(false) {
+FrameBuffer::FrameBuffer(int width, int height, const Graphics::PixelFormat &format) {
 	this->xsize = width;
 	this->ysize = height;
 	this->cmode = format;
 	this->pixelbytes = this->cmode.bytesPerPixel;
 	this->linesize = (xsize * this->pixelbytes + 3) & ~3;
 
-	int size = this->xsize * this->ysize * sizeof(unsigned int);
-
-	this->_zbuf = (unsigned int *)gl_zalloc(size);
-
-	byte *pixelBuffer = new byte[this->ysize * this->linesize];
-	this->pbuf.set(this->cmode, pixelBuffer);
-	this->frame_buffer_allocated = 1;
-
-	this->current_texture = NULL;
-	this->shadow_mask_buf = NULL;
+	this->buffer.zbuf = this->_zbuf = (unsigned int *)gl_zalloc(this->xsize * this->ysize * sizeof(unsigned int));
 
+	this->pbuf.set(this->cmode, new byte[this->ysize * this->linesize]);
 	this->buffer.pbuf = this->pbuf.getRawBuffer();
-	this->buffer.zbuf = this->_zbuf;
-	_blendingEnabled = false;
-	_alphaTestEnabled = false;
-	_depthTestEnabled = false;
-	_depthFunc = TGL_LESS;
-	_offsetStates = 0;
-	_offsetFactor = 0.0f;
-	_offsetUnits = 0.0f;
+
+	_currentTexture = nullptr;
 }
 
 FrameBuffer::~FrameBuffer() {
-	if (frame_buffer_allocated)
-		pbuf.free();
+	pbuf.free();
 	gl_free(_zbuf);
 }
 
@@ -329,12 +286,6 @@ void FrameBuffer::clearOffscreenBuffer(Buffer *buf) {
 	buf->used = false;
 }
 
-void FrameBuffer::setTexture(const Graphics::TexelBuffer *texture, unsigned int wraps, unsigned int wrapt) {
-	current_texture = texture;
-	wrapS = wraps;
-	wrapT = wrapt;
-}
-
 void getSurfaceRef(Graphics::Surface &surface) {
 	GLContext *c = gl_get_context();
 	assert(c->fb);
diff --git a/graphics/tinygl/zbuffer.h b/graphics/tinygl/zbuffer.h
index 1c42e31b1b..98b1c64d50 100644
--- a/graphics/tinygl/zbuffer.h
+++ b/graphics/tinygl/zbuffer.h
@@ -103,7 +103,6 @@ struct ZBufferPoint {
 };
 
 struct FrameBuffer {
-	FrameBuffer(int xsize, int ysize, const Graphics::PixelBuffer &frame_buffer);
 	FrameBuffer(int xsize, int ysize, const Graphics::PixelFormat &format);
 	~FrameBuffer();
 
@@ -394,6 +393,21 @@ public:
 		surface.init(xsize, ysize, linesize, pbuf.getRawBuffer(), cmode);
 	}
 
+	void setScissorRectangle(const Common::Rect &rect) {
+		_clipRectangle = rect;
+		_enableScissor = true;
+	}
+	void resetScissorRectangle() {
+		_enableScissor = false;
+	}
+	void setShadowMaskBuf(byte *shadowBuffer) {
+		_shadowMaskBuf = shadowBuffer;
+	}
+	void setShadowRGB(int r, int g, int b) {
+		_shadowColorR = r;
+		_shadowColorG = g;
+		_shadowColorB = b;
+	}
 	void enableBlending(bool enable) {
 		_blendingEnabled = enable;
 	}
@@ -433,11 +447,13 @@ public:
 	}
 
 	void enableDepthWrite(bool enable) {
-		this->_depthWrite = enable;
+		_depthWrite = enable;
 	}
 
-	bool isAlphaBlendingEnabled() const {
-		return _sourceBlendingFactor == TGL_SRC_ALPHA && _destinationBlendingFactor == TGL_ONE_MINUS_SRC_ALPHA;
+	void setTexture(const Graphics::TexelBuffer *texture, unsigned int wraps, unsigned int wrapt) {
+		_currentTexture = texture;
+		_wrapS = wraps;
+		_wrapT = wrapt;
 	}
 
 private:
@@ -449,10 +465,7 @@ private:
 	void blitOffscreenBuffer(Buffer *buffer);
 	void selectOffscreenBuffer(Buffer *buffer);
 	void clearOffscreenBuffer(Buffer *buffer);
-public:
-	void setTexture(const Graphics::TexelBuffer *texture, unsigned int wraps, unsigned int wrapt);
 
-private:
 	template <bool kInterpRGB, bool kInterpZ, bool kInterpST, bool kInterpSTZ, int kDrawLogic, bool kDepthWrite, bool enableAlphaTest, bool kEnableScissor, bool enableBlending>
 	void fillTriangle(ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint *p2);
 
@@ -486,16 +499,6 @@ private:
 	void fillLineFlat(ZBufferPoint *p1, ZBufferPoint *p2);
 	void fillLineInterp(ZBufferPoint *p1, ZBufferPoint *p2);
 
-public:
-	void setScissorRectangle(const Common::Rect &rect) {
-		_clipRectangle = rect;
-		_enableScissor = true;
-	}
-	void resetScissorRectangle() {
-		_enableScissor = false;
-	}
-
-private:
 	Common::Rect _clipRectangle;
 	bool _enableScissor;
 public:
@@ -507,42 +510,13 @@ private:
 
 	Buffer buffer;
 
-public:
-	unsigned char *shadow_mask_buf;
-	int shadow_color_r;
-	int shadow_color_g;
-	int shadow_color_b;
-private:
-	int frame_buffer_allocated;
-
 	unsigned char *dctable;
 	int *ctable;
-	const Graphics::TexelBuffer *current_texture;
 public:
 	int _textureSize;
 	int _textureSizeMask;
-private:
-	unsigned int wrapS, wrapT;
-
-public:
-	FORCEINLINE bool isBlendingEnabled() const { return _blendingEnabled; }
-	FORCEINLINE void getBlendingFactors(int &sourceFactor, int &destinationFactor) const { sourceFactor = _sourceBlendingFactor; destinationFactor = _destinationBlendingFactor; }
-	FORCEINLINE bool isAlphaTestEnabled() const { return _alphaTestEnabled; }
-private:
-	FORCEINLINE bool isDepthWriteEnabled() const { return _depthWrite; }
-public:
-	FORCEINLINE int getDepthFunc() const { return _depthFunc; }
-	FORCEINLINE int getDepthWrite() const { return _depthWrite; }
-	FORCEINLINE int getAlphaTestFunc() const { return _alphaTestFunc; }
-	FORCEINLINE int getAlphaTestRefVal() const { return _alphaTestRefVal; }
-	FORCEINLINE int getDepthTestEnabled() const { return _depthTestEnabled; }
-private:
-	FORCEINLINE int getOffsetStates() const { return _offsetStates; }
-	FORCEINLINE float getOffsetFactor() const { return _offsetFactor; }
-	FORCEINLINE float getOffsetUnits() const { return _offsetUnits; }
 
 private:
-
 	template <bool kDepthWrite>
 	FORCEINLINE void putPixel(unsigned int pixelOffset, int color, int x, int y, unsigned int z);
 
@@ -559,15 +533,22 @@ private:
 	void drawLine(const ZBufferPoint *p1, const ZBufferPoint *p2);
 
 	unsigned int *_zbuf;
-	bool _depthWrite;
 	Graphics::PixelBuffer pbuf;
+
+	const Graphics::TexelBuffer *_currentTexture;
+	unsigned int _wrapS, _wrapT;
+	byte *_shadowMaskBuf;
+	int _shadowColorR;
+	int _shadowColorG;
+	int _shadowColorB;
 	bool _blendingEnabled;
 	int _sourceBlendingFactor;
 	int _destinationBlendingFactor;
 	bool _alphaTestEnabled;
-	bool _depthTestEnabled;
 	int _alphaTestFunc;
 	int _alphaTestRefVal;
+	bool _depthTestEnabled;
+	bool _depthWrite;
 	int _depthFunc;
 	int _offsetStates;
 	float _offsetFactor;
diff --git a/graphics/tinygl/zdirtyrect.cpp b/graphics/tinygl/zdirtyrect.cpp
index 20f9f4121a..899f52ed4d 100644
--- a/graphics/tinygl/zdirtyrect.cpp
+++ b/graphics/tinygl/zdirtyrect.cpp
@@ -42,7 +42,7 @@ void GLContext::issueDrawCall(DrawCall *drawCall) {
 
 #if TGL_DIRTY_RECT_SHOW
 static void DebugDrawRectangle(Common::Rect rect, int r, int g, int b) {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
+	GLContext *c = gl_get_context();
 
 	if (rect.left < 0)
 		rect.left = 0;
@@ -253,7 +253,7 @@ void GLContext::presentBufferSimple() {
 }
 
 void presentBuffer() {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
+	GLContext *c = gl_get_context();
 	if (c->_enableDirtyRectangles) {
 		c->presentBufferDirtyRects();
 	} else {
@@ -281,8 +281,9 @@ bool DrawCall::operator==(const DrawCall &other) const {
 	}
 }
 
+
 RasterizationDrawCall::RasterizationDrawCall() : DrawCall(DrawCall_Rasterization) {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
+	GLContext *c = gl_get_context();
 	_vertexCount = c->vertex_cnt;
 	_vertex = (GLVertex *) Internal::allocateFrame(_vertexCount * sizeof(GLVertex));
 	_drawTriangleFront = c->draw_triangle_front;
@@ -302,7 +303,7 @@ void RasterizationDrawCall::computeDirtyRegion() {
 	}
 
 	if (!clip_code) {
-		TinyGL::GLContext *c = TinyGL::gl_get_context();
+		GLContext *c = gl_get_context();
 		int xmax = c->fb->xsize - 1;
 		int ymax = c->fb->ysize - 1;
 		int left = xmax, right = 0, top = ymax, bottom = 0;
@@ -328,7 +329,7 @@ void RasterizationDrawCall::computeDirtyRegion() {
 }
 
 void RasterizationDrawCall::execute(bool restoreState) const {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
+	GLContext *c = gl_get_context();
 
 	RasterizationDrawCall::RasterizationState backupState;
 	if (restoreState) {
@@ -336,13 +337,13 @@ void RasterizationDrawCall::execute(bool restoreState) const {
 	}
 	applyState(_state);
 
-	TinyGL::GLVertex *prevVertex = c->vertex;
+	GLVertex *prevVertex = c->vertex;
 	int prevVertexCount = c->vertex_cnt;
 
 	c->vertex = _vertex;
 	c->vertex_cnt = _vertexCount;
-	c->draw_triangle_front = (TinyGL::gl_draw_triangle_func)_drawTriangleFront;
-	c->draw_triangle_back = (TinyGL::gl_draw_triangle_func)_drawTriangleBack;
+	c->draw_triangle_front = (gl_draw_triangle_func)_drawTriangleFront;
+	c->draw_triangle_back = (gl_draw_triangle_func)_drawTriangleBack;
 
 	int n = c->vertex_n;
 	int cnt = c->vertex_cnt;
@@ -429,13 +430,13 @@ void RasterizationDrawCall::execute(bool restoreState) const {
 
 RasterizationDrawCall::RasterizationState RasterizationDrawCall::captureState() const {
 	RasterizationState state;
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
-	state.alphaTest = c->fb->isAlphaTestEnabled();
-	c->fb->getBlendingFactors(state.sfactor, state.dfactor);
-	state.enableBlending = c->fb->isBlendingEnabled();
-	state.alphaFunc = c->fb->getAlphaTestFunc();
-	state.alphaRefValue = c->fb->getAlphaTestRefVal();
-
+	GLContext *c = gl_get_context();
+	state.alphaTest = c->alpha_test_enabled;
+	state.sfactor = c->source_blending_factor;
+	state.dfactor = c->destination_blending_factor;
+	state.enableBlending = c->blending_enabled;
+	state.alphaFunc = c->alpha_test_func;
+	state.alphaRefValue = c->alpha_test_ref_val;
 	state.cullFaceEnabled = c->cull_face_enabled;
 	state.beginType = c->begin_type;
 	state.colorMask = c->color_mask;
@@ -452,11 +453,14 @@ RasterizationDrawCall::RasterizationState RasterizationDrawCall::captureState()
 	state.texture = c->current_texture;
 	state.wrapS = c->texture_wrap_s;
 	state.wrapT = c->texture_wrap_t;
-	state.shadowMaskBuf = c->fb->shadow_mask_buf;
-	state.depthFunction = c->fb->getDepthFunc();
-	state.depthWrite = c->fb->getDepthWrite();
+	state.shadowMaskBuf = c->shadow_mask_buf;
+	state.shadowColorR = c->shadow_color_r;
+	state.shadowColorG = c->shadow_color_g;
+	state.shadowColorB = c->shadow_color_b;
+	state.depthFunction = c->depth_func;
+	state.depthWrite = c->depth_write;
 	state.lightingEnabled = c->lighting_enabled;
-	state.depthTestEnabled = c->fb->getDepthTestEnabled();
+	state.depthTestEnabled = c->depth_test;
 	if (c->current_texture != nullptr)
 		state.textureVersion = c->current_texture->versionNumber;
 
@@ -467,9 +471,9 @@ RasterizationDrawCall::RasterizationState RasterizationDrawCall::captureState()
 }
 
 void RasterizationDrawCall::applyState(const RasterizationDrawCall::RasterizationState &state) const {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
-	c->fb->setBlendingFactors(state.sfactor, state.dfactor);
+	GLContext *c = gl_get_context();
 	c->fb->enableBlending(state.enableBlending);
+	c->fb->setBlendingFactors(state.sfactor, state.dfactor);
 	c->fb->enableAlphaTest(state.alphaTest);
 	c->fb->setAlphaTestFunc(state.alphaFunc, state.alphaRefValue);
 	c->fb->setDepthFunc(state.depthFunction);
@@ -478,6 +482,25 @@ void RasterizationDrawCall::applyState(const RasterizationDrawCall::Rasterizatio
 	c->fb->setOffsetStates(state.offsetStates);
 	c->fb->setOffsetFactor(state.offsetFactor);
 	c->fb->setOffsetUnits(state.offsetUnits);
+	c->fb->setShadowMaskBuf(state.shadowMaskBuf);
+	c->fb->setShadowRGB(state.shadowColorB, state.shadowColorG, state.shadowColorB);
+
+	c->blending_enabled = state.enableBlending;
+	c->source_blending_factor = state.sfactor;
+	c->destination_blending_factor = state.dfactor;
+	c->alpha_test_enabled = state.alphaTest;
+	c->alpha_test_func = state.alphaFunc;
+	c->alpha_test_ref_val = state.alphaRefValue;
+	c->depth_test = state.depthTest;
+	c->depth_func = state.depthFunction;
+	c->depth_write = state.depthWrite;
+	c->offset_states = state.offsetStates;
+	c->offset_factor = state.offsetFactor;
+	c->offset_units = state.offsetUnits;
+	c->shadow_mask_buf = state.shadowMaskBuf;
+	c->shadow_color_r = state.shadowColorR;
+	c->shadow_color_g = state.shadowColorG;
+	c->shadow_color_b = state.shadowColorB;
 
 	c->lighting_enabled = state.lightingEnabled;
 	c->cull_face_enabled = state.cullFaceEnabled;
@@ -485,7 +508,6 @@ void RasterizationDrawCall::applyState(const RasterizationDrawCall::Rasterizatio
 	c->color_mask = state.colorMask;
 	c->current_front_face = state.currentFrontFace;
 	c->current_shade_model = state.currentShadeModel;
-	c->depth_test = state.depthTest;
 	c->polygon_mode_back = state.polygonModeBack;
 	c->polygon_mode_front = state.polygonModeFront;
 	c->shadow_mode = state.shadowMode;
@@ -493,14 +515,13 @@ void RasterizationDrawCall::applyState(const RasterizationDrawCall::Rasterizatio
 	c->current_texture = state.texture;
 	c->texture_wrap_s = state.wrapS;
 	c->texture_wrap_t = state.wrapT;
-	c->fb->shadow_mask_buf = state.shadowMaskBuf;
 
 	memcpy(c->viewport.scale._v, state.viewportScaling, sizeof(c->viewport.scale._v));
 	memcpy(c->viewport.trans._v, state.viewportTranslation, sizeof(c->viewport.trans._v));
 }
 
 void RasterizationDrawCall::execute(const Common::Rect &clippingRectangle, bool restoreState) const {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
+	TinyGL::GLContext *c = gl_get_context();
 	c->fb->setScissorRectangle(clippingRectangle);
 	execute(restoreState);
 	c->fb->resetScissorRectangle();
@@ -521,11 +542,12 @@ bool RasterizationDrawCall::operator==(const RasterizationDrawCall &other) const
 	return false;
 }
 
+
 BlittingDrawCall::BlittingDrawCall(BlitImage *image, const BlitTransform &transform, BlittingMode blittingMode) : DrawCall(DrawCall_Blitting), _transform(transform), _mode(blittingMode), _image(image) {
 	tglIncBlitImageRef(image);
 	_blitState = captureState();
 	_imageVersion = tglGetBlitImageVersion(image);
-	if (TinyGL::gl_get_context()->_enableDirtyRectangles) {
+	if (gl_get_context()->_enableDirtyRectangles) {
 		computeDirtyRegion();
 	}
 }
@@ -570,23 +592,32 @@ void BlittingDrawCall::execute(const Common::Rect &clippingRectangle, bool resto
 
 BlittingDrawCall::BlittingState BlittingDrawCall::captureState() const {
 	BlittingState state;
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
-	state.alphaTest = c->fb->isAlphaTestEnabled();
-	c->fb->getBlendingFactors(state.sfactor, state.dfactor);
-	state.enableBlending = c->fb->isBlendingEnabled();
-	state.alphaFunc = c->fb->getAlphaTestFunc();
-	state.alphaRefValue = c->fb->getAlphaTestRefVal();
-	state.depthTestEnabled = c->fb->getDepthTestEnabled();
+	TinyGL::GLContext *c = gl_get_context();
+	state.enableBlending = c->blending_enabled;
+	state.sfactor = c->source_blending_factor;
+	state.dfactor = c->destination_blending_factor;
+	state.alphaTest = c->alpha_test_enabled;
+	state.alphaFunc = c->alpha_test_func;
+	state.alphaRefValue = c->alpha_test_ref_val;
+	state.depthTestEnabled = c->depth_test;
 	return state;
 }
 
 void BlittingDrawCall::applyState(const BlittingState &state) const {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
-	c->fb->setBlendingFactors(state.sfactor, state.dfactor);
+	TinyGL::GLContext *c = gl_get_context();
 	c->fb->enableBlending(state.enableBlending);
+	c->fb->setBlendingFactors(state.sfactor, state.dfactor);
 	c->fb->enableAlphaTest(state.alphaTest);
 	c->fb->setAlphaTestFunc(state.alphaFunc, state.alphaRefValue);
 	c->fb->enableDepthTest(state.depthTestEnabled);
+
+	c->blending_enabled = state.enableBlending;
+	c->source_blending_factor = state.sfactor;
+	c->destination_blending_factor = state.dfactor;
+	c->alpha_test_enabled = state.alphaTest;
+	c->alpha_test_func = state.alphaFunc;
+	c->alpha_test_ref_val = state.alphaRefValue;
+	c->depth_test = state.depthTestEnabled;
 }
 
 void BlittingDrawCall::computeDirtyRegion() {
@@ -615,7 +646,7 @@ void BlittingDrawCall::computeDirtyRegion() {
 			_transform._destinationRectangle.left + blitWidth + 1,
 			_transform._destinationRectangle.top + blitHeight + 1
 		);
-		_dirtyRegion.clip(TinyGL::gl_get_context()->renderRect);
+		_dirtyRegion.clip(gl_get_context()->renderRect);
 	}
 }
 
@@ -627,21 +658,22 @@ bool BlittingDrawCall::operator==(const BlittingDrawCall &other) const {
 			_imageVersion == tglGetBlitImageVersion(other._image);
 }
 
+
 ClearBufferDrawCall::ClearBufferDrawCall(bool clearZBuffer, int zValue, bool clearColorBuffer, int rValue, int gValue, int bValue)
 	: _clearZBuffer(clearZBuffer), _clearColorBuffer(clearColorBuffer), _zValue(zValue), _rValue(rValue), _gValue(gValue), _bValue(bValue), DrawCall(DrawCall_Clear) {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
+	TinyGL::GLContext *c = gl_get_context();
 	if (c->_enableDirtyRectangles) {
 		_dirtyRegion = c->renderRect;
 	}
 }
 
 void ClearBufferDrawCall::execute(bool restoreState) const {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
+	TinyGL::GLContext *c = gl_get_context();
 	c->fb->clear(_clearZBuffer, _zValue, _clearColorBuffer, _rValue, _gValue, _bValue);
 }
 
 void ClearBufferDrawCall::execute(const Common::Rect &clippingRectangle, bool restoreState) const {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
+	TinyGL::GLContext *c = gl_get_context();
 	Common::Rect clearRect = clippingRectangle.findIntersectingRect(getDirtyRegion());
 	c->fb->clearRegion(clearRect.left, clearRect.top, clearRect.width(), clearRect.height(), _clearZBuffer, _zValue, _clearColorBuffer, _rValue, _gValue, _bValue);
 }
@@ -679,20 +711,20 @@ bool RasterizationDrawCall::RasterizationState::operator==(const RasterizationSt
 			alphaTest == other.alphaTest &&
 			alphaFunc == other.alphaFunc &&
 			alphaRefValue == other.alphaRefValue &&
+			depthTestEnabled == other.depthTestEnabled &&
 			texture == other.texture &&
+			textureVersion == texture->versionNumber &&
 			shadowMaskBuf == other.shadowMaskBuf &&
 			viewportTranslation[0] == other.viewportTranslation[0] &&
 			viewportTranslation[1] == other.viewportTranslation[1] &&
 			viewportTranslation[2] == other.viewportTranslation[2] &&
 			viewportScaling[0] == other.viewportScaling[0] &&
 			viewportScaling[1] == other.viewportScaling[1] &&
-			viewportScaling[2] == other.viewportScaling[2] &&
-			depthTestEnabled == other.depthTestEnabled &&
-			textureVersion == texture->versionNumber;
+			viewportScaling[2] == other.viewportScaling[2];
 }
 
 void *Internal::allocateFrame(int size) {
-	TinyGL::GLContext *c = TinyGL::gl_get_context();
+	GLContext *c = gl_get_context();
 	return c->_drawCallAllocator[c->_currentAllocatorIndex].allocate(size);
 }
 
diff --git a/graphics/tinygl/zdirtyrect.h b/graphics/tinygl/zdirtyrect.h
index 13ab49f3fe..489ee7cadf 100644
--- a/graphics/tinygl/zdirtyrect.h
+++ b/graphics/tinygl/zdirtyrect.h
@@ -102,9 +102,9 @@ public:
 	void operator delete(void *p) { }
 private:
 	void computeDirtyRegion();
-	typedef void (*gl_draw_triangle_func_ptr)(TinyGL::GLContext *c, TinyGL::GLVertex *p0, TinyGL::GLVertex *p1, TinyGL::GLVertex *p2);
+	typedef void (*gl_draw_triangle_func_ptr)(GLContext *c, TinyGL::GLVertex *p0, TinyGL::GLVertex *p1, TinyGL::GLVertex *p2);
 	int _vertexCount;
-	TinyGL::GLVertex *_vertex;
+	GLVertex *_vertex;
 	gl_draw_triangle_func_ptr _drawTriangleFront, _drawTriangleBack;
 
 	struct RasterizationState {
@@ -116,6 +116,9 @@ private:
 		int depthFunction;
 		int depthWrite;
 		int shadowMode;
+		int shadowColorR;
+		int shadowColorG;
+		int shadowColorB;
 		int texture2DEnabled;
 		int currentShadeModel;
 		int polygonModeBack;
diff --git a/graphics/tinygl/zgl.h b/graphics/tinygl/zgl.h
index c332ec48ee..50d82fe582 100644
--- a/graphics/tinygl/zgl.h
+++ b/graphics/tinygl/zgl.h
@@ -265,6 +265,22 @@ struct GLContext {
 	FrameBuffer *fb;
 	Common::Rect renderRect;
 
+	// blending
+	bool blending_enabled;
+	int source_blending_factor;
+	int destination_blending_factor;
+
+	// alpha blending
+	bool alpha_test_enabled;
+	int alpha_test_func;
+	int alpha_test_ref_val;
+
+	// shadow
+	unsigned char *shadow_mask_buf;
+	int shadow_color_r;
+	int shadow_color_g;
+	int shadow_color_b;
+
 	// Internal texture size
 	int _textureSize;
 
@@ -392,7 +408,10 @@ struct GLContext {
 	int (*gl_resize_viewport)(int *xsize, int *ysize);
 
 	// depth test
-	int depth_test;
+	bool depth_test;
+	int depth_func;
+	bool depth_write;
+
 	int color_mask;
 
 	Common::Rect _scissorRect;
diff --git a/graphics/tinygl/ztriangle.cpp b/graphics/tinygl/ztriangle.cpp
index e2699fd5bb..a2d8b9541f 100644
--- a/graphics/tinygl/ztriangle.cpp
+++ b/graphics/tinygl/ztriangle.cpp
@@ -244,13 +244,13 @@ void FrameBuffer::fillTriangle(ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint
 
 	switch (kDrawLogic) {
 	case DRAW_SHADOW_MASK:
-		pm1 = shadow_mask_buf + p0->y * xsize;
+		pm1 = _shadowMaskBuf + p0->y * xsize;
 		break;
 	case DRAW_SHADOW:
-		pm1 = shadow_mask_buf + p0->y * xsize;
-		r1 = shadow_color_r;
-		g1 = shadow_color_g;
-		b1 = shadow_color_b;
+		pm1 = _shadowMaskBuf + p0->y * xsize;
+		r1 = _shadowColorR;
+		g1 = _shadowColorG;
+		b1 = _shadowColorB;
 		break;
 	case DRAW_DEPTH_ONLY:
 		break;
@@ -267,7 +267,7 @@ void FrameBuffer::fillTriangle(ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint
 	}
 
 	if ((kInterpST || kInterpSTZ) && (kDrawLogic == DRAW_FLAT || kDrawLogic == DRAW_SMOOTH)) {
-		texture = current_texture;
+		texture = _currentTexture;
 		fdzdx = (float)dzdx;
 		fndzdx = NB_INTERP * fdzdx;
 		ndszdx = NB_INTERP * dszdx;
@@ -543,7 +543,7 @@ void FrameBuffer::fillTriangle(ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint
 							zinv = (float)(1.0 / fz);
 						}
 						for (int _a = 0; _a < NB_INTERP; _a++) {
-							putPixelTextureMappingPerspective<kDepthWrite, kInterpRGB, kDrawLogic == DRAW_SMOOTH, kAlphaTestEnabled, kEnableScissor, kBlendingEnabled>(this, buf, texture, wrapS, wrapT,
+							putPixelTextureMappingPerspective<kDepthWrite, kInterpRGB, kDrawLogic == DRAW_SMOOTH, kAlphaTestEnabled, kEnableScissor, kBlendingEnabled>(this, buf, texture, _wrapS, _wrapT,
 							                           pz, _a, x, y, z, t, s, r, g, b, a, dzdx, dsdx, dtdx, drdx, dgdx, dbdx, dadx);
 						}
 						pz += NB_INTERP;
@@ -565,7 +565,7 @@ void FrameBuffer::fillTriangle(ZBufferPoint *p0, ZBufferPoint *p1, ZBufferPoint
 					}
 
 					while (n >= 0) {
-						putPixelTextureMappingPerspective<kDepthWrite, kInterpRGB, kDrawLogic == DRAW_SMOOTH, kAlphaTestEnabled, kEnableScissor, kBlendingEnabled>(this, buf, texture, wrapS, wrapT,
+						putPixelTextureMappingPerspective<kDepthWrite, kInterpRGB, kDrawLogic == DRAW_SMOOTH, kAlphaTestEnabled, kEnableScissor, kBlendingEnabled>(this, buf, texture, _wrapS, _wrapT,
 						                           pz, 0, x, y, z, t, s, r, g, b, a, dzdx, dsdx, dtdx, drdx, dgdx, dbdx, dadx);
 						pz += 1;
 						buf += 1;




More information about the Scummvm-git-logs mailing list