summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilson Fung <[email protected]>2012-09-03 01:36:47 -0800
committerAndrew Boktor <[email protected]>2014-08-14 13:48:54 -0700
commit73ea99a28b77c2601b19dd5574a2cb267859cbd7 (patch)
treec0220684caf4aafc03e33f424503a81a85c0d71e
parenta3c4210a12617d8441cea084fc1041f9d6b20821 (diff)
Fixing multi-element texel access. Now texture with RGBA components are read properly.
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 13949]
-rw-r--r--CHANGES2
-rw-r--r--src/cuda-sim/instructions.cc19
2 files changed, 14 insertions, 7 deletions
diff --git a/CHANGES b/CHANGES
index 1a05fbc..52017bf 100644
--- a/CHANGES
+++ b/CHANGES
@@ -26,6 +26,8 @@ Version 3.1.1+edits (development branch) versus 3.1.1
- Fixed incorrect counting of predicated instructions. Now instructions
are counted into gpu_sim_insn regardless of predication outcome. (Bug
#15 external)
+ - Added support for cudaReadModeNormalizedFloat (a texture read mode).
+ - Fixed mult-element texel access (e.g. texel with RGBA components).
Version 3.1.1 versus 3.1.0
- Add checks to top level makefile to ensure setup_environment is run and checks to
diff --git a/src/cuda-sim/instructions.cc b/src/cuda-sim/instructions.cc
index 65d3af8..e91ddd4 100644
--- a/src/cuda-sim/instructions.cc
+++ b/src/cuda-sim/instructions.cc
@@ -3831,27 +3831,32 @@ void tex_impl( const ptx_instruction *pI, ptx_thread_info *thread )
case B32_TYPE:
case S8_TYPE:
case S16_TYPE:
- case S32_TYPE:
+ case S32_TYPE: {
+ unsigned long long elementOffset = 0; // offset into the next element
mem->read( tex_array_index, cuArray->desc.x/8, &data1.u32);
+ elementOffset += cuArray->desc.x/8;
if (cuArray->desc.y) {
- mem->read( tex_array_index+4, cuArray->desc.y/8, &data2.u32);
+ mem->read( tex_array_index + elementOffset, cuArray->desc.y/8, &data2.u32);
+ elementOffset += cuArray->desc.y/8;
if (cuArray->desc.z) {
- mem->read( tex_array_index+8, cuArray->desc.z/8, &data3.u32);
+ mem->read( tex_array_index + elementOffset, cuArray->desc.z/8, &data3.u32);
+ elementOffset += cuArray->desc.z/8;
if (cuArray->desc.w)
- mem->read( tex_array_index+12, cuArray->desc.w/8, &data4.u32);
+ mem->read( tex_array_index + elementOffset, cuArray->desc.w/8, &data4.u32);
}
}
break;
+ }
case B64_TYPE:
case U64_TYPE:
case S64_TYPE:
mem->read( tex_array_index, 8, &data1.u64);
if (cuArray->desc.y) {
- mem->read( tex_array_index+4, 8, &data2.u64);
+ mem->read( tex_array_index+8, 8, &data2.u64);
if (cuArray->desc.z) {
- mem->read( tex_array_index+8, 8, &data3.u64);
+ mem->read( tex_array_index+16, 8, &data3.u64);
if (cuArray->desc.w)
- mem->read( tex_array_index+12, 8, &data4.u64);
+ mem->read( tex_array_index+24, 8, &data4.u64);
}
}
break;