From aeab9db50a1067836764ff2486412b04d2b3b3a2 Mon Sep 17 00:00:00 2001 From: George Kyriazis Date: Fri, 20 Apr 2018 13:29:39 -0500 Subject: [PATCH] swr/rast: Package events.proto with core output However only if the file exists in DEBUG_OUTPUT_DIR. The expectation is that AR rasterizerLauncher will start placing it there when launching a workload (which is in a subsequent checkin) Reviewed-by: Bruce Cherniak --- .../swr/rasterizer/archrast/archrast.cpp | 30 ++++++++++++++++++- .../templates/gen_ar_eventhandlerfile.hpp | 4 ++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/archrast/archrast.cpp b/src/gallium/drivers/swr/rasterizer/archrast/archrast.cpp index ff7bdc3ef73..502835ca801 100644 --- a/src/gallium/drivers/swr/rasterizer/archrast/archrast.cpp +++ b/src/gallium/drivers/swr/rasterizer/archrast/archrast.cpp @@ -93,7 +93,35 @@ namespace ArchRast class EventHandlerApiStats : public EventHandlerFile { public: - EventHandlerApiStats(uint32_t id) : EventHandlerFile(id) {} + EventHandlerApiStats(uint32_t id) : EventHandlerFile(id) { +#if defined(_WIN32) + // Attempt to copy the events.proto file to the ArchRast output dir. It's common for tools to place the events.proto file + // in the DEBUG_OUTPUT_DIR when launching AR. If it exists, this will attempt to copy it the first time we get here to package + // it with the stats. Otherwise, the user would need to specify the events.proto location when parsing the stats in post. + std::stringstream eventsProtoSrcFilename, eventsProtoDstFilename; + eventsProtoSrcFilename << KNOB_DEBUG_OUTPUT_DIR << "\\events.proto" << std::ends; + eventsProtoDstFilename << mOutputDir.substr(0, mOutputDir.size() - 1) << "\\events.proto" << std::ends; + + // If event.proto already exists, we're done; else do the copy + struct stat buf; // Use a Posix stat for file existence check + if (!stat(eventsProtoDstFilename.str().c_str(), &buf) == 0) { + // Now check to make sure the events.proto source exists + if (stat(eventsProtoSrcFilename.str().c_str(), &buf) == 0) { + std::ifstream srcFile; + srcFile.open(eventsProtoSrcFilename.str().c_str(), std::ios::binary); + if (srcFile.is_open()) + { + // Just do a binary buffer copy + std::ofstream dstFile; + dstFile.open(eventsProtoDstFilename.str().c_str(), std::ios::binary); + dstFile << srcFile.rdbuf(); + dstFile.close(); + } + srcFile.close(); + } + } +#endif + } virtual void Handle(const DrawInstancedEvent& event) { diff --git a/src/gallium/drivers/swr/rasterizer/codegen/templates/gen_ar_eventhandlerfile.hpp b/src/gallium/drivers/swr/rasterizer/codegen/templates/gen_ar_eventhandlerfile.hpp index d1852b35fde..54d24861de5 100644 --- a/src/gallium/drivers/swr/rasterizer/codegen/templates/gen_ar_eventhandlerfile.hpp +++ b/src/gallium/drivers/swr/rasterizer/codegen/templates/gen_ar_eventhandlerfile.hpp @@ -56,7 +56,8 @@ namespace ArchRast const char* pBaseName = strrchr(procname, '\\'); std::stringstream outDir; outDir << KNOB_DEBUG_OUTPUT_DIR << pBaseName << "_" << pid << std::ends; - CreateDirectory(outDir.str().c_str(), NULL); + mOutputDir = outDir.str(); + CreateDirectory(mOutputDir.c_str(), NULL); // There could be multiple threads creating thread pools. We // want to make sure they are uniquly identified by adding in @@ -152,6 +153,7 @@ namespace ArchRast } std::string mFilename; + std::string mOutputDir; static const uint32_t mBufferSize = 1024; uint8_t mBuffer[mBufferSize]; -- 2.30.2