nv50/ir: record number of threads in a compute shader
authorIlia Mirkin <imirkin@alum.mit.edu>
Sat, 28 May 2016 18:23:35 +0000 (14:23 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Mon, 30 May 2016 22:14:55 +0000 (18:14 -0400)
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_driver.h
src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_target.h
src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp

index 35cd7217c2c48ce43beee137ab587878f16dc8e5..2caebe87efe179ae1603692a3fbb51589d3247ce 100644 (file)
@@ -1178,6 +1178,7 @@ nv50_ir_init_prog_info(struct nv50_ir_prog_info *info)
       info->prop.gp.instanceCount = 1;
       info->prop.gp.maxVertices = 1;
    }
+   info->prop.cp.numThreads = 1;
    info->io.pointSize = 0xff;
    info->io.instanceId = 0xff;
    info->io.vertexId = 0xff;
index 1f7de51e3f6284126596fa48d9f8dde3ed97c878..b611519ade3732695ba0adf2e141027ff0cd1955 100644 (file)
@@ -153,6 +153,7 @@ struct nv50_ir_prog_info
          uint32_t inputOffset; /* base address for user args */
          uint32_t sharedOffset; /* reserved space in s[] */
          uint32_t gridInfoBase;  /* base address for NTID,NCTAID */
+         uint32_t numThreads; /* max number of threads */
       } cp;
    } prop;
 
index 1ebcd25e96a1f879cf6f87db7cf8c785a7bfc525..cd98f7009820abc48e9d7eb73cfd62fbb5ff8783 100644 (file)
@@ -1002,6 +1002,7 @@ bool Source::scanSource()
    }
 
    info->io.viewportId = -1;
+   info->prop.cp.numThreads = 1;
 
    info->immd.data = (uint32_t *)MALLOC(scan.immediate_count * 16);
    info->immd.type = (ubyte *)MALLOC(scan.immediate_count * sizeof(ubyte));
@@ -1105,7 +1106,7 @@ void Source::scanProperty(const struct tgsi_full_property *prop)
    case TGSI_PROPERTY_CS_FIXED_BLOCK_WIDTH:
    case TGSI_PROPERTY_CS_FIXED_BLOCK_HEIGHT:
    case TGSI_PROPERTY_CS_FIXED_BLOCK_DEPTH:
-      // we don't care
+      info->prop.cp.numThreads *= prop->u[0].Data;
       break;
    case TGSI_PROPERTY_NUM_CLIPDIST_ENABLED:
       info->io.clipDistances = prop->u[0].Data;
index 674bdc6964e65193cc2a321396bb1b69110aa139..6bf1a5cff2307962711c4af9e9804a9688fc0eab 100644 (file)
@@ -172,7 +172,9 @@ public:
    // The address chosen is supplied to the relocation routine.
    virtual void getBuiltinCode(const uint32_t **code, uint32_t *size) const = 0;
 
-   virtual void parseDriverInfo(const struct nv50_ir_prog_info *info) { }
+   virtual void parseDriverInfo(const struct nv50_ir_prog_info *info) {
+      threads = info->prop.cp.numThreads;
+   }
 
    virtual bool runLegalizePass(Program *, CGStage stage) const = 0;
 
@@ -248,6 +250,7 @@ public:
 
 protected:
    uint32_t chipset;
+   uint32_t threads;
 
    DataFile nativeFileMap[DATA_FILE_COUNT];
 
index 2af1715d1d195467a7ac2868c7e9210491aba408..b37ea730d0eb8af87ce55629d4714ed062e84657 100644 (file)
@@ -592,6 +592,8 @@ TargetNV50::parseDriverInfo(const struct nv50_ir_prog_info *info)
       wposMask = 0x8;
       sysvalLocation[SV_POSITION] = 0;
    }
+
+   Target::parseDriverInfo(info);
 }
 
 } // namespace nv50_ir