Reactor: Use std::shared_ptr to ref-count rr::Routines

The intrusive reference counting had no smart pointer, making it difficult to correctly manage reference counts. Most of the codebase did not call bind() and unbind() explictly, and relied on some other mechanism for keeping the routine alive.

By switching to std::shared_ptr, we automatically get guarantees that routine cache eviction will not destroy the routine while it is in use.

Bug: b/137524292
Bug: b/137649247
Change-Id: I38b5e8ba3ee084572a427a1de20f4f017ceaae5a
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/34168
Tested-by: Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Main/FrameBuffer.hpp b/src/Main/FrameBuffer.hpp
index f07feb3..94a1890 100644
--- a/src/Main/FrameBuffer.hpp
+++ b/src/Main/FrameBuffer.hpp
@@ -54,7 +54,7 @@
 		static void setCursorOrigin(int x0, int y0);
 		static void setCursorPosition(int x, int y);
 
-		static Routine *copyRoutine(const BlitState &state);
+		static std::shared_ptr<Routine> copyRoutine(const BlitState &state);
 
 	protected:
 		void copy(sw::Surface *source);
@@ -90,7 +90,7 @@
 		static Cursor cursor;
 
 		void (*blitFunction)(void *dst, void *src, Cursor *cursor);
-		Routine *blitRoutine;
+		std::shared_ptr<Routine> blitRoutine;
 		BlitState blitState;     // State of the current blitRoutine.
 		BlitState updateState;   // State of the routine to be generated.