From 73ea99a28b77c2601b19dd5574a2cb267859cbd7 Mon Sep 17 00:00:00 2001 From: Wilson Fung Date: Mon, 3 Sep 2012 01:36:47 -0800 Subject: 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] --- CHANGES | 2 ++ src/cuda-sim/instructions.cc | 19 ++++++++++++------- 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; -- cgit v1.3