swr/rast: Package events.proto with core output
authorGeorge Kyriazis <george.kyriazis@intel.com>
Fri, 20 Apr 2018 18:29:39 +0000 (13:29 -0500)
committerGeorge Kyriazis <george.kyriazis@intel.com>
Fri, 27 Apr 2018 19:36:41 +0000 (14:36 -0500)
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 <bruce.cherniak@intel.com>
src/gallium/drivers/swr/rasterizer/archrast/archrast.cpp
src/gallium/drivers/swr/rasterizer/codegen/templates/gen_ar_eventhandlerfile.hpp

index ff7bdc3ef73efb2fd2353a1a2d5823c54e0a7272..502835ca80130fd4d46f710fa9d61fd10c08f7dd 100644 (file)
@@ -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)
         {
index d1852b35fdeac5d227c5fe3280d398d0ea4fbfa2..54d24861de5aa928d31ce48053f33d7f6735a715 100644 (file)
@@ -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];