Przeglądaj źródła

Moved internal view state into single struct.

Branimir Karadžić 8 lat temu
rodzic
commit
85322904a9
8 zmienionych plików z 182 dodań i 131 usunięć
  1. 2 7
      src/bgfx.cpp
  2. 135 86
      src/bgfx_p.h
  3. 14 7
      src/renderer.h
  4. 7 7
      src/renderer_d3d11.cpp
  5. 6 6
      src/renderer_d3d12.cpp
  6. 5 5
      src/renderer_d3d9.cpp
  7. 7 7
      src/renderer_gl.cpp
  8. 6 6
      src/renderer_vk.cpp

+ 2 - 7
src/bgfx.cpp

@@ -900,7 +900,7 @@ namespace bgfx
 		m_key.m_view = _id;
 		m_key.m_view = _id;
 
 
 		SortKey::Enum type = SortKey::SortProgram;
 		SortKey::Enum type = SortKey::SortProgram;
-		switch (s_ctx->m_viewMode[_id])
+		switch (s_ctx->m_view[_id].m_mode)
 		{
 		{
 		case ViewMode::Sequential:      m_key.m_seq   = s_ctx->getSeqIncr(_id); type = SortKey::SortSequence; break;
 		case ViewMode::Sequential:      m_key.m_seq   = s_ctx->getSeqIncr(_id); type = SortKey::SortSequence; break;
 		case ViewMode::DepthAscending:  m_key.m_depth = (uint32_t)_depth;       type = SortKey::SortDepth;    break;
 		case ViewMode::DepthAscending:  m_key.m_depth = (uint32_t)_depth;       type = SortKey::SortDepth;    break;
@@ -1698,13 +1698,8 @@ namespace bgfx
 		m_submit->m_perfStats.numViews = 0;
 		m_submit->m_perfStats.numViews = 0;
 
 
 		bx::memCopy(m_submit->m_viewRemap, m_viewRemap, sizeof(m_viewRemap) );
 		bx::memCopy(m_submit->m_viewRemap, m_viewRemap, sizeof(m_viewRemap) );
-		bx::memCopy(m_submit->m_fb, m_fb, sizeof(m_fb) );
-		bx::memCopy(m_submit->m_clear, m_clear, sizeof(m_clear) );
-		bx::memCopy(m_submit->m_rect, m_rect, sizeof(m_rect) );
-		bx::memCopy(m_submit->m_scissor, m_scissor, sizeof(m_scissor) );
 		bx::memCopy(m_submit->m_view, m_view, sizeof(m_view) );
 		bx::memCopy(m_submit->m_view, m_view, sizeof(m_view) );
-		bx::memCopy(m_submit->m_proj, m_proj, sizeof(m_proj) );
-		bx::memCopy(m_submit->m_viewFlags, m_viewFlags, sizeof(m_viewFlags) );
+
 		if (m_colorPaletteDirty > 0)
 		if (m_colorPaletteDirty > 0)
 		{
 		{
 			--m_colorPaletteDirty;
 			--m_colorPaletteDirty;

+ 135 - 86
src/bgfx_p.h

@@ -275,6 +275,34 @@ namespace bgfx
 
 
 	struct Clear
 	struct Clear
 	{
 	{
+		void set(uint16_t _flags, uint32_t _rgba, float _depth, uint8_t _stencil)
+		{
+			m_flags    = _flags;
+			m_index[0] = uint8_t(_rgba>>24);
+			m_index[1] = uint8_t(_rgba>>16);
+			m_index[2] = uint8_t(_rgba>> 8);
+			m_index[3] = uint8_t(_rgba>> 0);
+			m_depth    = _depth;
+			m_stencil  = _stencil;
+		}
+
+		void set(uint16_t _flags, float _depth, uint8_t _stencil, uint8_t _0, uint8_t _1, uint8_t _2, uint8_t _3, uint8_t _4, uint8_t _5, uint8_t _6, uint8_t _7)
+		{
+			m_flags = (_flags & ~BGFX_CLEAR_COLOR)
+				| (0xff != (_0&_1&_2&_3&_4&_5&_6&_7) ? BGFX_CLEAR_COLOR|BGFX_CLEAR_COLOR_USE_PALETTE : 0)
+				;
+			m_index[0] = _0;
+			m_index[1] = _1;
+			m_index[2] = _2;
+			m_index[3] = _3;
+			m_index[4] = _4;
+			m_index[5] = _5;
+			m_index[6] = _6;
+			m_index[7] = _7;
+			m_depth    = _depth;
+			m_stencil  = _stencil;
+		}
+
 		uint8_t  m_index[8];
 		uint8_t  m_index[8];
 		float    m_depth;
 		float    m_depth;
 		uint8_t  m_stencil;
 		uint8_t  m_stencil;
@@ -1557,6 +1585,96 @@ namespace bgfx
 		uint16_t m_flags;
 		uint16_t m_flags;
 	};
 	};
 
 
+	BX_ALIGN_DECL_CACHE_LINE(struct) View
+	{
+		void reset()
+		{
+			setRect(0, 0, 1, 1);
+			setScissor(0, 0, 0, 0);
+			setClear(BGFX_CLEAR_NONE, 0, 0.0f, 0);
+			setMode(ViewMode::Default);
+			setFrameBuffer(BGFX_INVALID_HANDLE);
+			setTransform(NULL, NULL, BGFX_VIEW_NONE, NULL);
+		}
+
+		void setRect(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
+		{
+			m_rect.m_x = (uint16_t)bx::uint32_imax(int16_t(_x), 0);
+			m_rect.m_y = (uint16_t)bx::uint32_imax(int16_t(_y), 0);
+			m_rect.m_width  = bx::uint16_max(_width,  1);
+			m_rect.m_height = bx::uint16_max(_height, 1);
+		}
+
+		void setScissor(uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
+		{
+			m_scissor.m_x = _x;
+			m_scissor.m_y = _y;
+			m_scissor.m_width  = _width;
+			m_scissor.m_height = _height;
+		}
+
+		void setClear(uint16_t _flags, uint32_t _rgba, float _depth, uint8_t _stencil)
+		{
+			m_clear.set(_flags, _rgba, _depth, _stencil);
+		}
+
+		void setClear(uint16_t _flags, float _depth, uint8_t _stencil, uint8_t _0, uint8_t _1, uint8_t _2, uint8_t _3, uint8_t _4, uint8_t _5, uint8_t _6, uint8_t _7)
+		{
+			m_clear.set(_flags, _depth, _stencil, _0, _1, _2, _3, _4, _5, _6, _7);
+		}
+
+		void setMode(ViewMode::Enum _mode)
+		{
+			m_mode = uint8_t(_mode);
+		}
+
+		void setFrameBuffer(FrameBufferHandle _handle)
+		{
+			m_fbh = _handle;
+		}
+
+		void setTransform(const void* _view, const void* _proj, uint8_t _flags, const void* _proj1)
+		{
+			m_flags = _flags;
+
+			if (NULL != _view)
+			{
+				bx::memCopy(m_view.un.val, _view, sizeof(Matrix4) );
+			}
+			else
+			{
+				m_view.setIdentity();
+			}
+
+			if (NULL != _proj)
+			{
+				bx::memCopy(m_proj[0].un.val, _proj, sizeof(Matrix4) );
+			}
+			else
+			{
+				m_proj[0].setIdentity();
+			}
+
+			if (NULL != _proj1)
+			{
+				bx::memCopy(m_proj[1].un.val, _proj1, sizeof(Matrix4) );
+			}
+			else
+			{
+				bx::memCopy(m_proj[1].un.val, m_proj[0].un.val, sizeof(Matrix4) );
+			}
+		}
+
+		Clear   m_clear;
+		Rect    m_rect;
+		Rect    m_scissor;
+		Matrix4 m_view;
+		Matrix4 m_proj[2];
+		FrameBufferHandle m_fbh;
+		uint8_t m_mode;
+		uint8_t m_flags;
+	};
+
 	struct FrameCache
 	struct FrameCache
 	{
 	{
 		void reset()
 		void reset()
@@ -1738,14 +1856,10 @@ namespace bgfx
 		}
 		}
 
 
 		uint8_t m_viewRemap[BGFX_CONFIG_MAX_VIEWS];
 		uint8_t m_viewRemap[BGFX_CONFIG_MAX_VIEWS];
-		FrameBufferHandle m_fb[BGFX_CONFIG_MAX_VIEWS];
-		Clear m_clear[BGFX_CONFIG_MAX_VIEWS];
 		float m_colorPalette[BGFX_CONFIG_MAX_COLOR_PALETTE][4];
 		float m_colorPalette[BGFX_CONFIG_MAX_COLOR_PALETTE][4];
-		Rect m_rect[BGFX_CONFIG_MAX_VIEWS];
-		Rect m_scissor[BGFX_CONFIG_MAX_VIEWS];
-		Matrix4 m_view[BGFX_CONFIG_MAX_VIEWS];
-		Matrix4 m_proj[2][BGFX_CONFIG_MAX_VIEWS];
-		uint8_t m_viewFlags[BGFX_CONFIG_MAX_VIEWS];
+
+		View m_view[BGFX_CONFIG_MAX_VIEWS];
+
 		int32_t m_occlusion[BGFX_CONFIG_MAX_OCCLUSION_QUERIES];
 		int32_t m_occlusion[BGFX_CONFIG_MAX_OCCLUSION_QUERIES];
 
 
 		uint64_t m_sortKeys[BGFX_CONFIG_MAX_DRAW_CALLS+1];
 		uint64_t m_sortKeys[BGFX_CONFIG_MAX_DRAW_CALLS+1];
@@ -2488,7 +2602,10 @@ namespace bgfx
 
 
 			m_flipAfterRender = !!(_flags & BGFX_RESET_FLIP_AFTER_RENDER);
 			m_flipAfterRender = !!(_flags & BGFX_RESET_FLIP_AFTER_RENDER);
 
 
-			bx::memSet(m_fb, 0xff, sizeof(m_fb) );
+			for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
+			{
+				m_view[ii].setFrameBuffer(BGFX_INVALID_HANDLE);
+			}
 
 
 			for (uint16_t ii = 0, num = m_textureHandle.getNumHandles(); ii < num; ++ii)
 			for (uint16_t ii = 0, num = m_textureHandle.getNumHandles(); ii < num; ++ii)
 			{
 			{
@@ -3982,20 +4099,12 @@ namespace bgfx
 
 
 		BGFX_API_FUNC(void setViewRect(uint8_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height) )
 		BGFX_API_FUNC(void setViewRect(uint8_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height) )
 		{
 		{
-			Rect& rect = m_rect[_id];
-			rect.m_x = (uint16_t)bx::uint32_imax(int16_t(_x), 0);
-			rect.m_y = (uint16_t)bx::uint32_imax(int16_t(_y), 0);
-			rect.m_width  = bx::uint16_max(_width,  1);
-			rect.m_height = bx::uint16_max(_height, 1);
+			m_view[_id].setRect(_x, _y, _width, _height);
 		}
 		}
 
 
 		BGFX_API_FUNC(void setViewScissor(uint8_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height) )
 		BGFX_API_FUNC(void setViewScissor(uint8_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height) )
 		{
 		{
-			Rect& scissor = m_scissor[_id];
-			scissor.m_x = _x;
-			scissor.m_y = _y;
-			scissor.m_width  = _width;
-			scissor.m_height = _height;
+			m_view[_id].setScissor(_x, _y, _width, _height);
 		}
 		}
 
 
 		BGFX_API_FUNC(void setViewClear(uint8_t _id, uint16_t _flags, uint32_t _rgba, float _depth, uint8_t _stencil) )
 		BGFX_API_FUNC(void setViewClear(uint8_t _id, uint16_t _flags, uint32_t _rgba, float _depth, uint8_t _stencil) )
@@ -4005,14 +4114,7 @@ namespace bgfx
 				, _depth
 				, _depth
 				);
 				);
 
 
-			Clear& clear = m_clear[_id];
-			clear.m_flags = _flags;
-			clear.m_index[0] = uint8_t(_rgba>>24);
-			clear.m_index[1] = uint8_t(_rgba>>16);
-			clear.m_index[2] = uint8_t(_rgba>> 8);
-			clear.m_index[3] = uint8_t(_rgba>> 0);
-			clear.m_depth    = _depth;
-			clear.m_stencil  = _stencil;
+			m_view[_id].setClear(_flags, _rgba, _depth, _stencil);
 		}
 		}
 
 
 		BGFX_API_FUNC(void setViewClear(uint8_t _id, uint16_t _flags, float _depth, uint8_t _stencil, uint8_t _0, uint8_t _1, uint8_t _2, uint8_t _3, uint8_t _4, uint8_t _5, uint8_t _6, uint8_t _7) )
 		BGFX_API_FUNC(void setViewClear(uint8_t _id, uint16_t _flags, float _depth, uint8_t _stencil, uint8_t _0, uint8_t _1, uint8_t _2, uint8_t _3, uint8_t _4, uint8_t _5, uint8_t _6, uint8_t _7) )
@@ -4022,74 +4124,28 @@ namespace bgfx
 				, _depth
 				, _depth
 				);
 				);
 
 
-			Clear& clear = m_clear[_id];
-			clear.m_flags = (_flags & ~BGFX_CLEAR_COLOR)
-				| (0xff != (_0&_1&_2&_3&_4&_5&_6&_7) ? BGFX_CLEAR_COLOR|BGFX_CLEAR_COLOR_USE_PALETTE : 0)
-				;
-			clear.m_index[0] = _0;
-			clear.m_index[1] = _1;
-			clear.m_index[2] = _2;
-			clear.m_index[3] = _3;
-			clear.m_index[4] = _4;
-			clear.m_index[5] = _5;
-			clear.m_index[6] = _6;
-			clear.m_index[7] = _7;
-			clear.m_depth    = _depth;
-			clear.m_stencil  = _stencil;
+			m_view[_id].setClear(_flags, _depth, _stencil, _0, _1, _2, _3, _4, _5, _6, _7);
 		}
 		}
 
 
 		BGFX_API_FUNC(void setViewMode(uint8_t _id, ViewMode::Enum _mode) )
 		BGFX_API_FUNC(void setViewMode(uint8_t _id, ViewMode::Enum _mode) )
 		{
 		{
-			m_viewMode[_id] = uint8_t(_mode);
+			m_view[_id].setMode(_mode);
 		}
 		}
 
 
 		BGFX_API_FUNC(void setViewFrameBuffer(uint8_t _id, FrameBufferHandle _handle) )
 		BGFX_API_FUNC(void setViewFrameBuffer(uint8_t _id, FrameBufferHandle _handle) )
 		{
 		{
 			BGFX_CHECK_HANDLE_INVALID_OK("setViewFrameBuffer", m_frameBufferHandle, _handle);
 			BGFX_CHECK_HANDLE_INVALID_OK("setViewFrameBuffer", m_frameBufferHandle, _handle);
-			m_fb[_id] = _handle;
+			m_view[_id].setFrameBuffer(_handle);
 		}
 		}
 
 
 		BGFX_API_FUNC(void setViewTransform(uint8_t _id, const void* _view, const void* _proj, uint8_t _flags, const void* _proj1) )
 		BGFX_API_FUNC(void setViewTransform(uint8_t _id, const void* _view, const void* _proj, uint8_t _flags, const void* _proj1) )
 		{
 		{
-			m_viewFlags[_id] = _flags;
-
-			if (NULL != _view)
-			{
-				bx::memCopy(m_view[_id].un.val, _view, sizeof(Matrix4) );
-			}
-			else
-			{
-				m_view[_id].setIdentity();
-			}
-
-			if (NULL != _proj)
-			{
-				bx::memCopy(m_proj[0][_id].un.val, _proj, sizeof(Matrix4) );
-			}
-			else
-			{
-				m_proj[0][_id].setIdentity();
-			}
-
-			if (NULL != _proj1)
-			{
-				bx::memCopy(m_proj[1][_id].un.val, _proj1, sizeof(Matrix4) );
-			}
-			else
-			{
-				bx::memCopy(m_proj[1][_id].un.val, m_proj[0][_id].un.val, sizeof(Matrix4) );
-			}
+			m_view[_id].setTransform(_view, _proj, _flags, _proj1);
 		}
 		}
 
 
 		BGFX_API_FUNC(void resetView(uint8_t _id) )
 		BGFX_API_FUNC(void resetView(uint8_t _id) )
 		{
 		{
-			setViewRect(_id, 0, 0, 1, 1);
-			setViewScissor(_id, 0, 0, 0, 0);
-			setViewClear(_id, BGFX_CLEAR_NONE, 0, 0.0f, 0);
-			setViewMode(_id, ViewMode::Default);
-			FrameBufferHandle invalid = BGFX_INVALID_HANDLE;
-			setViewFrameBuffer(_id, invalid);
-			setViewTransform(_id, NULL, NULL, BGFX_VIEW_NONE, NULL);
+			m_view[_id].reset();
 		}
 		}
 
 
 		BGFX_API_FUNC(void setViewOrder(uint8_t _id, uint8_t _num, const uint8_t* _order) )
 		BGFX_API_FUNC(void setViewOrder(uint8_t _id, uint8_t _num, const uint8_t* _order) )
@@ -4510,17 +4566,10 @@ namespace bgfx
 		VertexDeclRef m_declRef;
 		VertexDeclRef m_declRef;
 
 
 		uint8_t m_viewRemap[BGFX_CONFIG_MAX_VIEWS];
 		uint8_t m_viewRemap[BGFX_CONFIG_MAX_VIEWS];
-		FrameBufferHandle m_fb[BGFX_CONFIG_MAX_VIEWS];
-		Clear m_clear[BGFX_CONFIG_MAX_VIEWS];
+		uint16_t m_seq[BGFX_CONFIG_MAX_VIEWS];
+		View m_view[BGFX_CONFIG_MAX_VIEWS];
 
 
 		float m_clearColor[BGFX_CONFIG_MAX_COLOR_PALETTE][4];
 		float m_clearColor[BGFX_CONFIG_MAX_COLOR_PALETTE][4];
-		Rect m_rect[BGFX_CONFIG_MAX_VIEWS];
-		Rect m_scissor[BGFX_CONFIG_MAX_VIEWS];
-		Matrix4 m_view[BGFX_CONFIG_MAX_VIEWS];
-		Matrix4 m_proj[2][BGFX_CONFIG_MAX_VIEWS];
-		uint8_t m_viewFlags[BGFX_CONFIG_MAX_VIEWS];
-		uint16_t m_seq[BGFX_CONFIG_MAX_VIEWS];
-		uint8_t m_viewMode[BGFX_CONFIG_MAX_VIEWS];
 
 
 		uint8_t m_colorPaletteDirty;
 		uint8_t m_colorPaletteDirty;
 
 

+ 14 - 7
src/renderer.h

@@ -59,7 +59,7 @@ namespace bgfx
 			m_invProjCached = UINT16_MAX;
 			m_invProjCached = UINT16_MAX;
 			m_invViewProjCached = UINT16_MAX;
 			m_invViewProjCached = UINT16_MAX;
 
 
-			m_view[0] = _frame->m_view;
+			m_view[0] = m_viewTmp[0];
 			m_view[1] = m_viewTmp[1];
 			m_view[1] = m_viewTmp[1];
 
 
 			if (_hmdEnabled)
 			if (_hmdEnabled)
@@ -79,20 +79,27 @@ namespace bgfx
 
 
 					for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
 					for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
 					{
 					{
-						if (BGFX_VIEW_STEREO == (_frame->m_viewFlags[ii] & BGFX_VIEW_STEREO) )
+						if (BGFX_VIEW_STEREO == (_frame->m_view[ii].m_flags & BGFX_VIEW_STEREO) )
 						{
 						{
 							bx::float4x4_mul(&m_view[eye][ii].un.f4x4
 							bx::float4x4_mul(&m_view[eye][ii].un.f4x4
-								, &_frame->m_view[ii].un.f4x4
+								, &_frame->m_view[ii].m_view.un.f4x4
 								, &viewAdjust.un.f4x4
 								, &viewAdjust.un.f4x4
 								);
 								);
 						}
 						}
 						else
 						else
 						{
 						{
-							bx::memCopy(&m_view[0][ii].un.f4x4, &_frame->m_view[ii].un.f4x4, sizeof(Matrix4) );
+							bx::memCopy(&m_view[0][ii].un.f4x4, &_frame->m_view[ii].m_view.un.f4x4, sizeof(Matrix4) );
 						}
 						}
 					}
 					}
 				}
 				}
 			}
 			}
+			else
+			{
+				for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
+				{
+					bx::memCopy(&m_view[0][ii].un.f4x4, &_frame->m_view[ii].m_view.un.f4x4, sizeof(Matrix4) );
+				}
+			}
 
 
 			for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
 			for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
 			{
 			{
@@ -100,7 +107,7 @@ namespace bgfx
 				{
 				{
 					bx::float4x4_mul(&m_viewProj[eye][ii].un.f4x4
 					bx::float4x4_mul(&m_viewProj[eye][ii].un.f4x4
 						, &m_view[eye][ii].un.f4x4
 						, &m_view[eye][ii].un.f4x4
-						, &_frame->m_proj[eye][ii].un.f4x4
+						, &_frame->m_view[ii].m_proj[eye].un.f4x4
 						);
 						);
 				}
 				}
 			}
 			}
@@ -180,7 +187,7 @@ namespace bgfx
 					{
 					{
 						_renderer->setShaderUniform4x4f(flags
 						_renderer->setShaderUniform4x4f(flags
 							, predefined.m_loc
 							, predefined.m_loc
-							, _frame->m_proj[_eye][_view].un.val
+							, _frame->m_view[_view].m_proj[_eye].un.val
 							, bx::uint32_min(mtxRegs, predefined.m_count)
 							, bx::uint32_min(mtxRegs, predefined.m_count)
 							);
 							);
 					}
 					}
@@ -193,7 +200,7 @@ namespace bgfx
 						{
 						{
 							m_invProjCached = viewEye;
 							m_invProjCached = viewEye;
 							bx::float4x4_inverse(&m_invProj.un.f4x4
 							bx::float4x4_inverse(&m_invProj.un.f4x4
-								, &_frame->m_proj[_eye][_view].un.f4x4
+								, &_frame->m_view[_view].m_proj[_eye].un.f4x4
 								);
 								);
 						}
 						}
 
 

+ 7 - 7
src/renderer_d3d11.cpp

@@ -5652,7 +5652,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
 			bool viewRestart = false;
 			bool viewRestart = false;
 			uint8_t eye = 0;
 			uint8_t eye = 0;
 			uint8_t restartState = 0;
 			uint8_t restartState = 0;
-			viewState.m_rect = _render->m_rect[0];
+			viewState.m_rect = _render->m_view[0].m_rect;
 
 
 			int32_t numItems = _render->m_numRenderItems;
 			int32_t numItems = _render->m_numRenderItems;
 			for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;)
 			for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;)
@@ -5685,13 +5685,13 @@ BX_PRAGMA_DIAGNOSTIC_POP();
 					view = key.m_view;
 					view = key.m_view;
 					programIdx = kInvalidHandle;
 					programIdx = kInvalidHandle;
 
 
-					if (_render->m_fb[view].idx != fbh.idx)
+					if (_render->m_view[view].m_fbh.idx != fbh.idx)
 					{
 					{
-						fbh = _render->m_fb[view];
+						fbh = _render->m_view[view].m_fbh;
 						setFrameBuffer(fbh);
 						setFrameBuffer(fbh);
 					}
 					}
 
 
-					viewRestart = ( (BGFX_VIEW_STEREO == (_render->m_viewFlags[view] & BGFX_VIEW_STEREO) ) );
+					viewRestart = ( (BGFX_VIEW_STEREO == (_render->m_view[view].m_flags & BGFX_VIEW_STEREO) ) );
 					viewRestart &= hmdEnabled;
 					viewRestart &= hmdEnabled;
 					if (viewRestart)
 					if (viewRestart)
 					{
 					{
@@ -5717,7 +5717,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
 
 
 					profiler.begin(view);
 					profiler.begin(view);
 
 
-					viewState.m_rect = _render->m_rect[view];
+					viewState.m_rect = _render->m_view[view].m_rect;
 					if (viewRestart)
 					if (viewRestart)
 					{
 					{
 						if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
 						if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
@@ -5753,7 +5753,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
 						}
 						}
 					}
 					}
 
 
-					const Rect& scissorRect = _render->m_scissor[view];
+					const Rect& scissorRect = _render->m_view[view].m_scissor;
 					viewHasScissor = !scissorRect.isZero();
 					viewHasScissor = !scissorRect.isZero();
 					viewScissorRect = viewHasScissor ? scissorRect : viewState.m_rect;
 					viewScissorRect = viewHasScissor ? scissorRect : viewState.m_rect;
 
 
@@ -5765,7 +5765,7 @@ BX_PRAGMA_DIAGNOSTIC_POP();
 					vp.MinDepth = 0.0f;
 					vp.MinDepth = 0.0f;
 					vp.MaxDepth = 1.0f;
 					vp.MaxDepth = 1.0f;
 					deviceCtx->RSSetViewports(1, &vp);
 					deviceCtx->RSSetViewports(1, &vp);
-					Clear& clr = _render->m_clear[view];
+					Clear& clr = _render->m_view[view].m_clear;
 
 
 					if (BGFX_CLEAR_NONE != (clr.m_flags & BGFX_CLEAR_MASK) )
 					if (BGFX_CLEAR_NONE != (clr.m_flags & BGFX_CLEAR_MASK) )
 					{
 					{

+ 6 - 6
src/renderer_d3d12.cpp

@@ -5125,7 +5125,7 @@ data.NumQualityLevels = 0;
 
 
 // 			uint8_t eye = 0;
 // 			uint8_t eye = 0;
 // 			uint8_t restartState = 0;
 // 			uint8_t restartState = 0;
-			viewState.m_rect = _render->m_rect[0];
+			viewState.m_rect = _render->m_view[0].m_rect;
 
 
 			int32_t numItems = _render->m_numRenderItems;
 			int32_t numItems = _render->m_numRenderItems;
 			for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;)
 			for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;)
@@ -5155,7 +5155,7 @@ data.NumQualityLevels = 0;
 					currentProgramIdx      = kInvalidHandle;
 					currentProgramIdx      = kInvalidHandle;
 					hasPredefined          = false;
 					hasPredefined          = false;
 
 
-					fbh = _render->m_fb[view];
+					fbh = _render->m_view[view].m_fbh;
 					setFrameBuffer(fbh);
 					setFrameBuffer(fbh);
 
 
 					if (item > 1)
 					if (item > 1)
@@ -5165,9 +5165,9 @@ data.NumQualityLevels = 0;
 
 
 					profiler.begin(view);
 					profiler.begin(view);
 
 
-					viewState.m_rect = _render->m_rect[view];
-					const Rect& rect        = _render->m_rect[view];
-					const Rect& scissorRect = _render->m_scissor[view];
+					viewState.m_rect = _render->m_view[view].m_rect;
+					const Rect& rect        = _render->m_view[view].m_rect;
+					const Rect& scissorRect = _render->m_view[view].m_scissor;
 					viewHasScissor  = !scissorRect.isZero();
 					viewHasScissor  = !scissorRect.isZero();
 					viewScissorRect = viewHasScissor ? scissorRect : rect;
 					viewScissorRect = viewHasScissor ? scissorRect : rect;
 
 
@@ -5188,7 +5188,7 @@ data.NumQualityLevels = 0;
 					m_commandList->RSSetScissorRects(1, &rc);
 					m_commandList->RSSetScissorRects(1, &rc);
 					restoreScissor = false;
 					restoreScissor = false;
 
 
-					Clear& clr = _render->m_clear[view];
+					Clear& clr = _render->m_view[view].m_clear;
 					if (BGFX_CLEAR_NONE != clr.m_flags)
 					if (BGFX_CLEAR_NONE != clr.m_flags)
 					{
 					{
 						Rect clearRect = rect;
 						Rect clearRect = rect;

+ 5 - 5
src/renderer_d3d9.cpp

@@ -3811,9 +3811,9 @@ namespace bgfx { namespace d3d9
 					view = key.m_view;
 					view = key.m_view;
 					programIdx = kInvalidHandle;
 					programIdx = kInvalidHandle;
 
 
-					if (_render->m_fb[view].idx != fbh.idx)
+					if (_render->m_view[view].m_fbh.idx != fbh.idx)
 					{
 					{
-						fbh = _render->m_fb[view];
+						fbh = _render->m_view[view].m_fbh;
 						setFrameBuffer(fbh);
 						setFrameBuffer(fbh);
 					}
 					}
 
 
@@ -3826,8 +3826,8 @@ namespace bgfx { namespace d3d9
 					profiler.begin(view);
 					profiler.begin(view);
 					PIX_BEGINEVENT(D3DCOLOR_VIEW, s_viewNameW[view]);
 					PIX_BEGINEVENT(D3DCOLOR_VIEW, s_viewNameW[view]);
 
 
-					viewState.m_rect        = _render->m_rect[view];
-					const Rect& scissorRect = _render->m_scissor[view];
+					viewState.m_rect        = _render->m_view[view].m_rect;
+					const Rect& scissorRect = _render->m_view[view].m_scissor;
 					viewHasScissor  = !scissorRect.isZero();
 					viewHasScissor  = !scissorRect.isZero();
 					viewScissorRect = viewHasScissor ? scissorRect : viewState.m_rect;
 					viewScissorRect = viewHasScissor ? scissorRect : viewState.m_rect;
 
 
@@ -3840,7 +3840,7 @@ namespace bgfx { namespace d3d9
 					vp.MaxZ = 1.0f;
 					vp.MaxZ = 1.0f;
 					DX_CHECK(device->SetViewport(&vp) );
 					DX_CHECK(device->SetViewport(&vp) );
 
 
-					Clear& clear = _render->m_clear[view];
+					Clear& clear = _render->m_view[view].m_clear;
 
 
 					if (BGFX_CLEAR_NONE != (clear.m_flags & BGFX_CLEAR_MASK) )
 					if (BGFX_CLEAR_NONE != (clear.m_flags & BGFX_CLEAR_MASK) )
 					{
 					{

+ 7 - 7
src/renderer_gl.cpp

@@ -6627,7 +6627,7 @@ namespace bgfx { namespace gl
 
 
 			bool viewRestart = false;
 			bool viewRestart = false;
 			uint8_t restartState = 0;
 			uint8_t restartState = 0;
-			viewState.m_rect = _render->m_rect[0];
+			viewState.m_rect = _render->m_view[0].m_rect;
 
 
 			int32_t numItems = _render->m_numRenderItems;
 			int32_t numItems = _render->m_numRenderItems;
 			for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;)
 			for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;)
@@ -6660,9 +6660,9 @@ namespace bgfx { namespace gl
 					view = key.m_view;
 					view = key.m_view;
 					programIdx = kInvalidHandle;
 					programIdx = kInvalidHandle;
 
 
-					if (_render->m_fb[view].idx != fbh.idx)
+					if (_render->m_view[view].m_fbh.idx != fbh.idx)
 					{
 					{
-						fbh = _render->m_fb[view];
+						fbh = _render->m_view[view].m_fbh;
 						resolutionHeight = hmdEnabled
 						resolutionHeight = hmdEnabled
 							? _render->m_hmd.height
 							? _render->m_hmd.height
 							: _render->m_resolution.m_height
 							: _render->m_resolution.m_height
@@ -6670,7 +6670,7 @@ namespace bgfx { namespace gl
 						resolutionHeight = setFrameBuffer(fbh, resolutionHeight, discardFlags);
 						resolutionHeight = setFrameBuffer(fbh, resolutionHeight, discardFlags);
 					}
 					}
 
 
-					viewRestart = ( (BGFX_VIEW_STEREO == (_render->m_viewFlags[view] & BGFX_VIEW_STEREO) ) );
+					viewRestart = ( (BGFX_VIEW_STEREO == (_render->m_view[view].m_flags & BGFX_VIEW_STEREO) ) );
 					viewRestart &= hmdEnabled;
 					viewRestart &= hmdEnabled;
 					if (viewRestart)
 					if (viewRestart)
 					{
 					{
@@ -6695,7 +6695,7 @@ namespace bgfx { namespace gl
 
 
 					profiler.begin(view);
 					profiler.begin(view);
 
 
-					viewState.m_rect = _render->m_rect[view];
+					viewState.m_rect = _render->m_view[view].m_rect;
 					if (viewRestart)
 					if (viewRestart)
 					{
 					{
 						if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
 						if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
@@ -6727,7 +6727,7 @@ namespace bgfx { namespace gl
 						}
 						}
 					}
 					}
 
 
-					const Rect& scissorRect = _render->m_scissor[view];
+					const Rect& scissorRect = _render->m_view[view].m_scissor;
 					viewHasScissor  = !scissorRect.isZero();
 					viewHasScissor  = !scissorRect.isZero();
 					viewScissorRect = viewHasScissor ? scissorRect : viewState.m_rect;
 					viewScissorRect = viewHasScissor ? scissorRect : viewState.m_rect;
 
 
@@ -6737,7 +6737,7 @@ namespace bgfx { namespace gl
 						, viewState.m_rect.m_height
 						, viewState.m_rect.m_height
 						) );
 						) );
 
 
-					Clear& clear = _render->m_clear[view];
+					Clear& clear = _render->m_view[view].m_clear;
 					discardFlags = clear.m_flags & BGFX_CLEAR_DISCARD_MASK;
 					discardFlags = clear.m_flags & BGFX_CLEAR_DISCARD_MASK;
 
 
 					if (BGFX_CLEAR_NONE != (clear.m_flags & BGFX_CLEAR_MASK) )
 					if (BGFX_CLEAR_NONE != (clear.m_flags & BGFX_CLEAR_MASK) )

+ 6 - 6
src/renderer_vk.cpp

@@ -3756,7 +3756,7 @@ VK_DESTROY
 
 
 // 			uint8_t eye = 0;
 // 			uint8_t eye = 0;
 // 			uint8_t restartState = 0;
 // 			uint8_t restartState = 0;
-			viewState.m_rect = _render->m_rect[0];
+			viewState.m_rect = _render->m_view[0].m_rect;
 
 
 			int32_t numItems = _render->m_numRenderItems;
 			int32_t numItems = _render->m_numRenderItems;
 			for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;)
 			for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;)
@@ -3797,12 +3797,12 @@ BX_UNUSED(currentSamplerStateIdx);
 					currentProgramIdx      = kInvalidHandle;
 					currentProgramIdx      = kInvalidHandle;
 					hasPredefined          = false;
 					hasPredefined          = false;
 
 
-					fbh = _render->m_fb[view];
+					fbh = _render->m_view[view].m_fbh;
 					setFrameBuffer(fbh);
 					setFrameBuffer(fbh);
 
 
-					viewState.m_rect = _render->m_rect[view];
-					const Rect& rect        = _render->m_rect[view];
-					const Rect& scissorRect = _render->m_scissor[view];
+					viewState.m_rect = _render->m_view[view].m_rect;
+					const Rect& rect        = _render->m_view[view].m_rect;
+					const Rect& scissorRect = _render->m_view[view].m_scissor;
 					viewHasScissor  = !scissorRect.isZero();
 					viewHasScissor  = !scissorRect.isZero();
 					viewScissorRect = viewHasScissor ? scissorRect : rect;
 					viewScissorRect = viewHasScissor ? scissorRect : rect;
 
 
@@ -3832,7 +3832,7 @@ BX_UNUSED(currentSamplerStateIdx);
 
 
 					restoreScissor = false;
 					restoreScissor = false;
 
 
-					Clear& clr = _render->m_clear[view];
+					Clear& clr = _render->m_view[view].m_clear;
 					if (BGFX_CLEAR_NONE != clr.m_flags)
 					if (BGFX_CLEAR_NONE != clr.m_flags)
 					{
 					{
 						Rect clearRect = rect;
 						Rect clearRect = rect;