P4 to Git Change 1258779 by gandryey@gera-ocl on 2016/04/15 19:16:15
SWDEV-92245 - [CQE OCL][QR][G] Multiple 32/64 bit Bolt sample crashes on all CPUs. FaultyCL#1257532 - Bolt calls map/unmap with the same region twice. Add a counter for the same region to track that case Affected files ... ... //depot/stg/opencl/drivers/opencl/runtime/device/device.cpp#195 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/device.hpp#272 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuvirtual.cpp#401 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.cpp#6 edit
Este cometimento está contido em:
@@ -689,11 +689,7 @@ Memory::saveMapInfo(
|
||||
WriteMapInfo* pInfo = &info;
|
||||
auto it = writeMapInfo_.find(mapAddress);
|
||||
if (it != writeMapInfo_.end()) {
|
||||
LogWarning("Double map of the same region!");
|
||||
}
|
||||
else {
|
||||
writeMapInfo_.insert(std::pair<const void*, WriteMapInfo>(mapAddress, info));
|
||||
it = writeMapInfo_.find(mapAddress);
|
||||
LogWarning("Double map of the same or overlapped region!");
|
||||
pInfo = &it->second;
|
||||
}
|
||||
|
||||
@@ -707,6 +703,12 @@ Memory::saveMapInfo(
|
||||
pInfo->unmapRead_ = true;
|
||||
}
|
||||
pInfo->baseMip_ = baseMip;
|
||||
|
||||
// Insert into the map if it's the first region
|
||||
if (++pInfo->count_ == 1) {
|
||||
writeMapInfo_.insert(std::pair<const void*, WriteMapInfo>(mapAddress, info));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Program::Program(amd::Device& device)
|
||||
|
||||
@@ -629,13 +629,14 @@ public:
|
||||
SyncFlags(): value_(0) {}
|
||||
};
|
||||
|
||||
struct WriteMapInfo: public amd::EmbeddedObject
|
||||
struct WriteMapInfo: public amd::HeapObject
|
||||
{
|
||||
amd::Coord3D origin_; //!< Origin of the map location
|
||||
amd::Coord3D region_; //!< Mapped region
|
||||
amd::Image* baseMip_; //!< The base mip level for images
|
||||
union {
|
||||
struct {
|
||||
uint32_t count_: 8; //!< The same map region counter
|
||||
uint32_t unmapWrite_: 1; //!< Unmap write operation
|
||||
uint32_t unmapRead_: 1; //!< Unmap read operation
|
||||
uint32_t entire_: 1; //!< Process the entire memory
|
||||
@@ -766,7 +767,7 @@ public:
|
||||
auto it = writeMapInfo_.find(mapAddress);
|
||||
if (it == writeMapInfo_.end()) {
|
||||
if (writeMapInfo_.size() == 0) {
|
||||
assert(false && "Unmap() call without map!");
|
||||
LogError("Unmap is a NOP!");
|
||||
return nullptr;
|
||||
}
|
||||
LogWarning("Unknown unmap signature!");
|
||||
@@ -786,7 +787,9 @@ public:
|
||||
// Get the first map info
|
||||
it = writeMapInfo_.begin();
|
||||
}
|
||||
writeMapInfo_.erase(it);
|
||||
if (--it->second.count_ == 0) {
|
||||
writeMapInfo_.erase(it);
|
||||
}
|
||||
}
|
||||
|
||||
//! Returns state of memory direct access flag
|
||||
|
||||
@@ -1179,12 +1179,16 @@ VirtualGPU::submitUnmapMemory(amd::UnmapMemoryCommand& vcmd)
|
||||
// Make sure VirtualGPU has an exclusive access to the resources
|
||||
amd::ScopedLock lock(execution());
|
||||
|
||||
profilingBegin(vcmd, true);
|
||||
gpu::Memory* memory = dev().getGpuMemory(&vcmd.memory());
|
||||
amd::Memory* owner = memory->owner();
|
||||
bool unmapMip = false;
|
||||
const device::Memory::WriteMapInfo* writeMapInfo =
|
||||
memory->writeMapInfo(vcmd.mapPtr());
|
||||
if (nullptr == writeMapInfo) {
|
||||
LogError("Unmap without map call");
|
||||
return;
|
||||
}
|
||||
profilingBegin(vcmd, true);
|
||||
|
||||
// Check if image is a mipmap and assign a saved view
|
||||
amd::Image* amdImage = owner->asImage();
|
||||
|
||||
@@ -1422,12 +1422,16 @@ VirtualGPU::submitUnmapMemory(amd::UnmapMemoryCommand& vcmd)
|
||||
// Make sure VirtualGPU has an exclusive access to the resources
|
||||
amd::ScopedLock lock(execution());
|
||||
|
||||
profilingBegin(vcmd, true);
|
||||
pal::Memory* memory = dev().getGpuMemory(&vcmd.memory());
|
||||
amd::Memory* owner = memory->owner();
|
||||
bool unmapMip = false;
|
||||
const device::Memory::WriteMapInfo* writeMapInfo =
|
||||
memory->writeMapInfo(vcmd.mapPtr());
|
||||
if (nullptr == writeMapInfo) {
|
||||
LogError("Unmap without map call");
|
||||
return;
|
||||
}
|
||||
profilingBegin(vcmd, true);
|
||||
|
||||
// Check if image is a mipmap and assign a saved view
|
||||
amd::Image* amdImage = owner->asImage();
|
||||
|
||||
Criar uma nova questão referindo esta
Bloquear um utilizador