Removed some dependencies on old threading class - Added separate mutexes for both caches in the Blitter and used std::mutex instead of MutexLock. - Removed some now unused inclusions/forward declaration from the Context class and fixed the fallout of doing that in other files. - Also moved SwiftConfig to std::thread/std::mutex - Removed unused inclusions of System/Thread.hpp where possible. Bug b/132280877 Change-Id: Ic1a992ee3161c141ec1a16471420955c6309f58f Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31031 Reviewed-by: Nicolas Capens <nicolascapens@google.com> Tested-by: Alexis Hétu <sugoi@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Device/Blitter.cpp b/src/Device/Blitter.cpp index 957f819..ce4a2b0 100644 --- a/src/Device/Blitter.cpp +++ b/src/Device/Blitter.cpp
@@ -25,16 +25,16 @@ namespace sw { - Blitter::Blitter() + Blitter::Blitter() : + blitMutex(), + blitCache(1024), + cornerUpdateMutex(), + cornerUpdateCache(64) // We only need one of these per format { - blitCache = new RoutineCache<State>(1024); - cornerUpdateCache = new RoutineCache<State>(64); // We only need one of these per format } Blitter::~Blitter() { - delete blitCache; - delete cornerUpdateCache; } void Blitter::clear(void *pixel, vk::Format format, vk::Image *dest, const vk::Format& viewFormat, const VkImageSubresourceRange& subresourceRange, const VkRect2D* renderArea) @@ -52,7 +52,7 @@ } State state(format, dstFormat, 1, dest->getSampleCountFlagBits(), { 0xF }); - Routine *blitRoutine = getRoutine(state); + Routine *blitRoutine = getBlitRoutine(state); if(!blitRoutine) { return; @@ -1531,10 +1531,10 @@ return function("BlitRoutine"); } - Routine *Blitter::getRoutine(const State &state) + Routine *Blitter::getBlitRoutine(const State &state) { - criticalSection.lock(); - Routine *blitRoutine = blitCache->query(state); + std::unique_lock<std::mutex> lock(blitMutex); + Routine *blitRoutine = blitCache.query(state); if(!blitRoutine) { @@ -1542,19 +1542,37 @@ if(!blitRoutine) { - criticalSection.unlock(); UNIMPLEMENTED("blitRoutine"); return nullptr; } - blitCache->add(state, blitRoutine); + blitCache.add(state, blitRoutine); } - criticalSection.unlock(); - return blitRoutine; } + Routine *Blitter::getCornerUpdateRoutine(const State &state) + { + std::unique_lock<std::mutex> lock(cornerUpdateMutex); + Routine *cornerUpdateRoutine = cornerUpdateCache.query(state); + + if(!cornerUpdateRoutine) + { + cornerUpdateRoutine = generateCornerUpdate(state); + + if(!cornerUpdateRoutine) + { + UNIMPLEMENTED("cornerUpdateRoutine"); + return nullptr; + } + + cornerUpdateCache.add(state, cornerUpdateRoutine); + } + + return cornerUpdateRoutine; + } + void Blitter::blitToBuffer(const vk::Image *src, VkImageSubresourceLayers subresource, VkOffset3D offset, VkExtent3D extent, uint8_t *dst, int bufferRowPitch, int bufferSlicePitch) { auto aspect = static_cast<VkImageAspectFlagBits>(subresource.aspectMask); @@ -1562,7 +1580,7 @@ State state(format, format.getNonQuadLayoutFormat(), VK_SAMPLE_COUNT_1_BIT, VK_SAMPLE_COUNT_1_BIT, {false, false}); - Routine *blitRoutine = getRoutine(state); + Routine *blitRoutine = getBlitRoutine(state); if(!blitRoutine) { return; @@ -1628,7 +1646,7 @@ State state(format.getNonQuadLayoutFormat(), format, VK_SAMPLE_COUNT_1_BIT, VK_SAMPLE_COUNT_1_BIT, {false, false}); - Routine *blitRoutine = getRoutine(state); + Routine *blitRoutine = getBlitRoutine(state); if(!blitRoutine) { return; @@ -1735,7 +1753,7 @@ (static_cast<uint32_t>(region.srcOffsets[1].y) > srcExtent.height) || (doFilter && ((x0 < 0.5f) || (y0 < 0.5f))); - Routine *blitRoutine = getRoutine(state); + Routine *blitRoutine = getBlitRoutine(state); if(!blitRoutine) { return; @@ -1933,25 +1951,12 @@ UNIMPLEMENTED("Multi-sampled cube: %d samples", static_cast<int>(samples)); } - criticalSection.lock(); - Routine *cornerUpdateRoutine = cornerUpdateCache->query(state); - + Routine *cornerUpdateRoutine = getCornerUpdateRoutine(state); if(!cornerUpdateRoutine) { - cornerUpdateRoutine = generateCornerUpdate(state); - - if(!cornerUpdateRoutine) - { - criticalSection.unlock(); - UNIMPLEMENTED("cornerUpdateRoutine"); - return; - } - - cornerUpdateCache->add(state, cornerUpdateRoutine); + return; } - criticalSection.unlock(); - void(*cornerUpdateFunction)(const CubeBorderData *data) = (void(*)(const CubeBorderData*))cornerUpdateRoutine->getEntry(); VkExtent3D extent = image->getMipLevelExtent(aspect, subresourceLayers.mipLevel);
diff --git a/src/Device/Blitter.hpp b/src/Device/Blitter.hpp index 513bf86..99feb22 100644 --- a/src/Device/Blitter.hpp +++ b/src/Device/Blitter.hpp
@@ -133,8 +133,9 @@ static Int ComputeOffset(Int &x, Int &y, Int &pitchB, int bytes, bool quadLayout); static Float4 LinearToSRGB(Float4 &color); static Float4 sRGBtoLinear(Float4 &color); - Routine *getRoutine(const State &state); + Routine *getBlitRoutine(const State &state); Routine *generate(const State &state); + Routine *getCornerUpdateRoutine(const State &state); Routine *generateCornerUpdate(const State& state); void computeCubeCorner(Pointer<Byte>& layer, Int& x0, Int& x1, Int& y0, Int& y1, Int& pitchB, const State& state); @@ -142,9 +143,10 @@ const VkImageSubresourceLayers& dstSubresourceLayers, Edge dstEdge, const VkImageSubresourceLayers& srcSubresourceLayers, Edge srcEdge); - RoutineCache<State> *blitCache; - RoutineCache<State> *cornerUpdateCache; - std::mutex criticalSection; + std::mutex blitMutex; + RoutineCache<State> blitCache; // guarded by blitMutex + std::mutex cornerUpdateMutex; + RoutineCache<State> cornerUpdateCache; // guarded by cornerUpdateMutex }; }
diff --git a/src/Device/Config.cpp b/src/Device/Config.cpp index 9e2e918..a155044 100644 --- a/src/Device/Config.cpp +++ b/src/Device/Config.cpp
@@ -14,7 +14,6 @@ #include "Config.hpp" -#include "System/Thread.hpp" #include "System/Timer.hpp" namespace sw
diff --git a/src/Device/Context.hpp b/src/Device/Context.hpp index 250e313..107ebe0 100644 --- a/src/Device/Context.hpp +++ b/src/Device/Context.hpp
@@ -17,14 +17,10 @@ #include "Vulkan/VkConfig.h" #include "Vulkan/VkDescriptorSet.hpp" -#include "Sampler.hpp" +#include "Config.hpp" #include "Stream.hpp" -#include "Point.hpp" -#include "Vertex.hpp" #include "System/Types.hpp" -#include <Vulkan/VkConfig.h> - namespace vk { class DescriptorSet; @@ -34,14 +30,7 @@ namespace sw { - struct Sampler; - class PixelShader; - class VertexShader; class SpirvShader; - struct Triangle; - struct Primitive; - struct Vertex; - class Resource; enum In // Default input stream semantic {
diff --git a/src/Device/PixelProcessor.hpp b/src/Device/PixelProcessor.hpp index 232ae47..0ab9d88 100644 --- a/src/Device/PixelProcessor.hpp +++ b/src/Device/PixelProcessor.hpp
@@ -15,6 +15,7 @@ #ifndef sw_PixelProcessor_hpp #define sw_PixelProcessor_hpp +#include "Color.hpp" #include "Context.hpp" #include "RoutineCache.hpp" @@ -24,6 +25,7 @@ class Rasterizer; struct Texture; struct DrawData; + struct Primitive; class PixelProcessor {
diff --git a/src/Device/SwiftConfig.cpp b/src/Device/SwiftConfig.cpp index 5e1c2f9..7db5021 100644 --- a/src/Device/SwiftConfig.cpp +++ b/src/Device/SwiftConfig.cpp
@@ -111,9 +111,8 @@ void SwiftConfig::getConfiguration(Configuration &configuration) { - criticalSection.lock(); + std::unique_lock<std::mutex> lock(criticalSection); configuration = config; - criticalSection.unlock(); } void SwiftConfig::serverRoutine(void *parameters) @@ -186,7 +185,7 @@ { if(match(&request, " ") || match(&request, "/ ")) { - criticalSection.lock(); + std::unique_lock<std::mutex> lock(criticalSection); const char *postData = strstr(request, "\r\n\r\n"); postData = postData ? postData + 4 : 0; @@ -214,7 +213,7 @@ destroyServer(); } - criticalSection.unlock(); + lock.unlock(); return send(clientSocket, OK, page()); }
diff --git a/src/Device/VertexProcessor.hpp b/src/Device/VertexProcessor.hpp index 025c165..811ac32 100644 --- a/src/Device/VertexProcessor.hpp +++ b/src/Device/VertexProcessor.hpp
@@ -18,6 +18,7 @@ #include "Matrix.hpp" #include "Context.hpp" #include "RoutineCache.hpp" +#include "Vertex.hpp" #include "Pipeline/SpirvShader.hpp" namespace sw
diff --git a/src/Vulkan/VkCommandBuffer.hpp b/src/Vulkan/VkCommandBuffer.hpp index 5e59a79..df99cd8 100644 --- a/src/Vulkan/VkCommandBuffer.hpp +++ b/src/Vulkan/VkCommandBuffer.hpp
@@ -18,6 +18,7 @@ #include "VkConfig.h" #include "VkObject.hpp" #include "VkDescriptorSet.hpp" +#include "Device/Color.hpp" #include "Device/Context.hpp" #include <memory> #include <vector>