mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00

This is fixed reupload of this commit after auto revert With this commit OpenCL will track if external host memory is used from few threads and will secure to update task count in all threads before destroing allocation. Resolves: NEO-6807 Signed-off-by: Maciej Plewka <maciej.plewka@intel.com>
117 lines
3.2 KiB
C++
117 lines
3.2 KiB
C++
/*
|
|
* Copyright (C) 2020-2022 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
*/
|
|
|
|
#pragma once
|
|
#include "shared/source/command_stream/command_stream_receiver.h"
|
|
#include "shared/source/helpers/cache_policy.h"
|
|
#include "shared/source/memory_manager/graphics_allocation.h"
|
|
#include "shared/source/os_interface/os_context.h"
|
|
|
|
namespace NEO {
|
|
|
|
class Surface {
|
|
public:
|
|
Surface(bool isCoherent = false) : IsCoherent(isCoherent) {}
|
|
virtual ~Surface() = default;
|
|
virtual void makeResident(CommandStreamReceiver &csr) = 0;
|
|
virtual Surface *duplicate() = 0;
|
|
virtual bool allowsL3Caching() { return true; }
|
|
bool IsCoherent;
|
|
};
|
|
|
|
class NullSurface : public Surface {
|
|
public:
|
|
NullSurface(){};
|
|
~NullSurface() override = default;
|
|
|
|
void makeResident(CommandStreamReceiver &csr) override{};
|
|
Surface *duplicate() override { return new NullSurface(); };
|
|
};
|
|
|
|
class HostPtrSurface : public Surface {
|
|
public:
|
|
HostPtrSurface(const void *ptr, size_t size) : memoryPointer(ptr), surfaceSize(size) {
|
|
UNRECOVERABLE_IF(!ptr);
|
|
gfxAllocation = nullptr;
|
|
}
|
|
|
|
HostPtrSurface(const void *ptr, size_t size, bool copyAllowed) : HostPtrSurface(ptr, size) {
|
|
isPtrCopyAllowed = copyAllowed;
|
|
}
|
|
|
|
HostPtrSurface(const void *ptr, size_t size, GraphicsAllocation *allocation) : memoryPointer(ptr), surfaceSize(size), gfxAllocation(allocation) {
|
|
DEBUG_BREAK_IF(!ptr);
|
|
}
|
|
~HostPtrSurface() override = default;
|
|
|
|
void makeResident(CommandStreamReceiver &csr) override {
|
|
DEBUG_BREAK_IF(!gfxAllocation);
|
|
gfxAllocation->prepareHostPtrForResidency(&csr);
|
|
csr.makeResidentHostPtrAllocation(gfxAllocation);
|
|
}
|
|
Surface *duplicate() override {
|
|
return new HostPtrSurface(this->memoryPointer, this->surfaceSize, this->gfxAllocation);
|
|
};
|
|
|
|
const void *getMemoryPointer() const {
|
|
return memoryPointer;
|
|
}
|
|
size_t getSurfaceSize() const {
|
|
return surfaceSize;
|
|
}
|
|
|
|
void setAllocation(GraphicsAllocation *allocation) {
|
|
this->gfxAllocation = allocation;
|
|
}
|
|
|
|
GraphicsAllocation *getAllocation() {
|
|
return gfxAllocation;
|
|
}
|
|
|
|
bool peekIsPtrCopyAllowed() {
|
|
return isPtrCopyAllowed;
|
|
}
|
|
|
|
bool allowsL3Caching() override {
|
|
return isL3Capable(*gfxAllocation);
|
|
}
|
|
|
|
void setIsPtrCopyAllowed(bool allowed) {
|
|
this->isPtrCopyAllowed = allowed;
|
|
}
|
|
|
|
protected:
|
|
const void *memoryPointer;
|
|
size_t surfaceSize;
|
|
GraphicsAllocation *gfxAllocation;
|
|
bool isPtrCopyAllowed = false;
|
|
};
|
|
|
|
class GeneralSurface : public Surface {
|
|
public:
|
|
GeneralSurface() : Surface(false) {
|
|
gfxAllocation = nullptr;
|
|
}
|
|
GeneralSurface(GraphicsAllocation *gfxAlloc) : Surface(gfxAlloc->isCoherent()) {
|
|
gfxAllocation = gfxAlloc;
|
|
};
|
|
~GeneralSurface() override = default;
|
|
|
|
void makeResident(CommandStreamReceiver &csr) override {
|
|
csr.makeResident(*gfxAllocation);
|
|
};
|
|
Surface *duplicate() override { return new GeneralSurface(gfxAllocation); };
|
|
void setGraphicsAllocation(GraphicsAllocation *newAllocation) {
|
|
gfxAllocation = newAllocation;
|
|
IsCoherent = newAllocation->isCoherent();
|
|
}
|
|
|
|
protected:
|
|
GraphicsAllocation *gfxAllocation;
|
|
};
|
|
} // namespace NEO
|