P4 to Git Change 1551967 by gandryey@gera-w8 on 2018/05/08 14:11:14

SWDEV-151981 - Removal of CPU support on Windows
	- Part 4. Remove CPU specific logic for CL-GL interop

Affected files ...

... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d10.cpp#17 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d10_amd.hpp#10 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d11.cpp#26 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d11_amd.hpp#14 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d9.cpp#35 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d9_amd.hpp#18 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_gl.cpp#58 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_gl_amd.hpp#21 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/interop.hpp#13 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/memory.hpp#103 edit
このコミットが含まれているのは:
foreman
2018-05-08 15:07:44 -04:00
コミット 32bca51906
8個のファイルの変更9行の追加897行の削除
-304
ファイルの表示
@@ -1404,99 +1404,6 @@ void BufferD3D10::initDeviceMemory() {
memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory));
}
bool BufferD3D10::mapExtObjectInCQThread() {
void* pCpuMem = NULL;
HRESULT hr;
D3D10_MAP gpuMap;
UINT cpuAccess;
if (getMemFlags() & CL_MEM_READ_WRITE) {
gpuMap = D3D10_MAP_READ_WRITE;
cpuAccess = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;
} else if (getMemFlags() & CL_MEM_READ_ONLY) {
gpuMap = D3D10_MAP_READ;
cpuAccess = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;
} else if (getMemFlags() & CL_MEM_WRITE_ONLY) {
gpuMap = D3D10_MAP_WRITE;
cpuAccess = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;
} else {
// Should not get here, the flags had been checked before
LogError("\nInvalid memrory flags");
return false;
}
if (getUsage() == D3D10_USAGE_STAGING) {
// Can map directly
hr = reinterpret_cast<ID3D10Buffer*>(getD3D10Resource())->Map(gpuMap, 0, &pCpuMem);
if (hr != S_OK || !pCpuMem) {
LogError("Cannot map ID3D10Buffer object to CPU memory");
return false;
}
} else {
// The buffer need to be mapped indirectly
// Create auxiliary buffer
ID3D10Device* pD3D10Dev;
getD3D10Resource()->GetDevice(&pD3D10Dev);
if (!pD3D10Dev) {
LogError("\nCannot get D3D10 device");
return false;
}
pD3D10Dev->Release();
D3D10_BUFFER_DESC bufDesc = {getResourceByteSize(), D3D10_USAGE_STAGING, 0, cpuAccess, 0};
ID3D10Buffer* pAuxBuf;
hr = pD3D10Dev->CreateBuffer(&bufDesc, NULL, &pAuxBuf);
if (hr != S_OK || !pAuxBuf) {
LogError("\nCannot create auxiliary buffer");
return false;
}
setD3D10AuxRes(pAuxBuf);
// Copy contents of original buffer to auxiliary
pD3D10Dev->CopyResource(pAuxBuf, getD3D10Resource());
// Now map the aux buffer
hr = pAuxBuf->Map(gpuMap, 0, &pCpuMem);
if (hr != S_OK || !pCpuMem) {
LogError("Cannot map D3D10 auxiliary buffer to CPU memory");
return false;
}
}
setHostMem(pCpuMem);
return true;
}
bool BufferD3D10::unmapExtObjectInCQThread() {
if (getMemFlags() & (CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY)) {
if (getD3D10AuxRes()) {
// Need to copy data from aux to original
reinterpret_cast<ID3D10Buffer*>(getD3D10AuxRes())->Unmap();
ID3D10Device* pD3D10Dev;
getD3D10AuxRes()->GetDevice(&pD3D10Dev);
if (!pD3D10Dev) {
LogError("\nCannot get D3D10 device");
return false;
}
pD3D10Dev->Release();
pD3D10Dev->CopyResource(getD3D10Resource(), getD3D10AuxRes());
getD3D10AuxRes()->Release();
setD3D10AuxRes(NULL);
} else {
reinterpret_cast<ID3D10Buffer*>(getD3D10Resource())->Unmap();
}
} else {
// Just unmap everything, no need to copy contents
if (getD3D10AuxRes()) {
reinterpret_cast<ID3D10Buffer*>(getD3D10AuxRes())->Unmap();
getD3D10AuxRes()->Release();
setD3D10AuxRes(NULL);
} else {
reinterpret_cast<ID3D10Buffer*>(getD3D10Resource())->Unmap();
}
}
setHostMem(NULL);
return true;
}
//
// Class Image1DD3D10 implementation
//
@@ -1507,16 +1414,6 @@ void Image1DD3D10::initDeviceMemory() {
memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory));
}
bool Image1DD3D10::mapExtObjectInCQThread() {
LogError("\nImage1DD3D10::mapExtObjectInCQThread() is not implemented yet\n");
return false;
}
bool Image1DD3D10::unmapExtObjectInCQThread() {
LogError("\nImage1DD3D10::unmapExtObjectInCQThread() is not implemented yet\n");
return false;
}
//
// Class Image2DD3D10 implementation
//
@@ -1527,106 +1424,6 @@ void Image2DD3D10::initDeviceMemory() {
memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory));
}
bool Image2DD3D10::mapExtObjectInCQThread() {
D3D10_MAPPED_TEXTURE2D texture2D;
HRESULT hr;
D3D10_MAP gpuMap;
UINT cpuAccess;
if (getMemFlags() & CL_MEM_READ_WRITE) {
gpuMap = D3D10_MAP_READ_WRITE;
cpuAccess = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;
} else if (getMemFlags() & CL_MEM_READ_ONLY) {
gpuMap = D3D10_MAP_READ;
cpuAccess = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;
} else if (getMemFlags() & CL_MEM_WRITE_ONLY) {
gpuMap = D3D10_MAP_WRITE;
cpuAccess = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;
} else {
// Should not get here, the flags had been checked before
LogError("\nInvalid memrory flags");
return false;
}
if (getUsage() == D3D10_USAGE_STAGING) {
// Can map directly
hr = reinterpret_cast<ID3D10Texture2D*>(getD3D10Resource())
->Map(getSubresource(), gpuMap, 0, &texture2D);
if (hr != S_OK || !texture2D.pData) {
LogError("Cannot map ID3D10Texture2D object to CPU memory");
return false;
}
} else {
// The texture needs to be mapped indirectly.
// Create auxiliary texture.
ID3D10Device* pD3D10Dev;
getD3D10Resource()->GetDevice(&pD3D10Dev);
if (!pD3D10Dev) {
LogError("\nCannot get D3D10 device");
return false;
}
pD3D10Dev->Release();
D3D10_TEXTURE2D_DESC texDesc;
reinterpret_cast<ID3D10Texture2D*>(getD3D10Resource())->GetDesc(&texDesc);
texDesc.Usage = D3D10_USAGE_STAGING;
texDesc.MipLevels = 1;
texDesc.BindFlags = 0;
texDesc.CPUAccessFlags = cpuAccess;
texDesc.MiscFlags = 0;
ID3D10Texture2D* pAuxTex;
hr = pD3D10Dev->CreateTexture2D(&texDesc, NULL, &pAuxTex);
if (hr != S_OK) {
LogError("\nCannot create auxiliary 2D texture");
return false;
}
setD3D10AuxRes(pAuxTex);
// Copy contents of original texture to auxiliary
pD3D10Dev->CopyResource(pAuxTex, getD3D10Resource());
// Now map the aux texture
hr = pAuxTex->Map(0, gpuMap, 0, &texture2D);
if (hr != S_OK || !texture2D.pData) {
LogError("Cannot map D3D10 auxiliary 2D texture to CPU memory");
return false;
}
}
setHostMem(texture2D.pData);
return true;
}
bool Image2DD3D10::unmapExtObjectInCQThread() {
if (getMemFlags() & (CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY)) {
if (getD3D10AuxRes()) {
// Need to copy data from aux to original
reinterpret_cast<ID3D10Texture2D*>(getD3D10AuxRes())->Unmap(0);
ID3D10Device* pD3D10Dev;
getD3D10AuxRes()->GetDevice(&pD3D10Dev);
if (!pD3D10Dev) {
LogError("\nCannot get D3D10 device");
return false;
}
pD3D10Dev->Release();
pD3D10Dev->CopyResource(getD3D10Resource(), getD3D10AuxRes());
getD3D10AuxRes()->Release();
setD3D10AuxRes(NULL);
} else {
reinterpret_cast<ID3D10Texture2D*>(getD3D10Resource())->Unmap(getSubresource());
}
} else {
// Just unmap everything, no need to copy contents
if (getD3D10AuxRes()) {
reinterpret_cast<ID3D10Texture2D*>(getD3D10AuxRes())->Unmap(0);
getD3D10AuxRes()->Release();
setD3D10AuxRes(NULL);
} else {
reinterpret_cast<ID3D10Texture2D*>(getD3D10Resource())->Unmap(getSubresource());
}
}
setHostMem(NULL);
return true;
}
//
// Class Image3DD3D10 implementation
//
@@ -1636,107 +1433,6 @@ void Image3DD3D10::initDeviceMemory() {
memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory));
}
bool Image3DD3D10::mapExtObjectInCQThread() {
D3D10_MAPPED_TEXTURE3D texture3D;
HRESULT hr;
D3D10_MAP gpuMap;
UINT cpuAccess;
if (getMemFlags() & CL_MEM_READ_WRITE) {
gpuMap = D3D10_MAP_READ_WRITE;
cpuAccess = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;
} else if (getMemFlags() & CL_MEM_READ_ONLY) {
gpuMap = D3D10_MAP_READ;
cpuAccess = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;
} else if (getMemFlags() & CL_MEM_WRITE_ONLY) {
gpuMap = D3D10_MAP_WRITE;
cpuAccess = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;
} else {
// Should not get here, the flags had been checked before
LogError("\nInvalid memrory flags");
return false;
}
if (getUsage() == D3D10_USAGE_STAGING) {
// Can map directly
hr = reinterpret_cast<ID3D10Texture3D*>(getD3D10Resource())
->Map(getSubresource(), gpuMap, 0, &texture3D);
if (hr != S_OK || !texture3D.pData) {
LogError("Cannot map ID3D10Texture3D object to CPU memory");
return false;
}
} else {
// The texture needs to be mapped indirectly.
// Create auxiliary texture.
ID3D10Device* pD3D10Dev;
getD3D10Resource()->GetDevice(&pD3D10Dev);
if (!pD3D10Dev) {
LogError("\nCannot get D3D10 device");
return false;
}
pD3D10Dev->Release();
D3D10_TEXTURE3D_DESC texDesc;
reinterpret_cast<ID3D10Texture3D*>(getD3D10Resource())->GetDesc(&texDesc);
texDesc.Usage = D3D10_USAGE_STAGING;
texDesc.MipLevels = 1;
texDesc.BindFlags = 0;
texDesc.CPUAccessFlags = cpuAccess;
texDesc.MiscFlags = 0;
ID3D10Texture3D* pAuxTex;
hr = pD3D10Dev->CreateTexture3D(&texDesc, NULL, &pAuxTex);
if (hr != S_OK) {
LogError("\nCannot create auxiliary 3D texture");
return false;
}
setD3D10AuxRes(pAuxTex);
// Copy contents of original texture to auxiliary
pD3D10Dev->CopyResource(pAuxTex, getD3D10Resource());
// Now map the aux texture
hr = pAuxTex->Map(0, gpuMap, 0, &texture3D);
if (hr != S_OK || !texture3D.pData) {
LogError("Cannot map D3D10 auxiliary 3D texture to CPU memory");
return false;
}
}
setHostMem(texture3D.pData);
return true;
}
bool Image3DD3D10::unmapExtObjectInCQThread() {
if (getMemFlags() & (CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY)) {
if (getD3D10AuxRes()) {
// Need to copy data from aux to original
reinterpret_cast<ID3D10Texture3D*>(getD3D10AuxRes())->Unmap(0);
ID3D10Device* pD3D10Dev;
getD3D10AuxRes()->GetDevice(&pD3D10Dev);
if (!pD3D10Dev) {
LogError("\nCannot get D3D10 device");
return false;
}
pD3D10Dev->Release();
pD3D10Dev->CopyResource(getD3D10Resource(), getD3D10AuxRes());
getD3D10AuxRes()->Release();
setD3D10AuxRes(NULL);
} else {
reinterpret_cast<ID3D10Texture3D*>(getD3D10Resource())->Unmap(getSubresource());
}
} else {
// Just unmap everything, no need to copy contents
if (getD3D10AuxRes()) {
reinterpret_cast<ID3D10Texture3D*>(getD3D10AuxRes())->Unmap(0);
getD3D10AuxRes()->Release();
setD3D10AuxRes(NULL);
} else {
reinterpret_cast<ID3D10Texture3D*>(getD3D10Resource())->Unmap(getSubresource());
}
}
setHostMem(NULL);
return true;
}
} // namespace amd
#endif //_WIN32
-16
ファイルの表示
@@ -240,10 +240,6 @@ public:
setInteropObj(this);
}
virtual ~BufferD3D10() {}
//! For CPU device only!
virtual bool mapExtObjectInCQThread(void);
virtual bool unmapExtObjectInCQThread(void);
};
//! Class Image1DD3D10 is derived from classes Image1D and D3D10Object
@@ -278,10 +274,6 @@ public:
setInteropObj(this);
}
virtual ~Image1DD3D10() {}
//! For CPU device only!
virtual bool mapExtObjectInCQThread(void);
virtual bool unmapExtObjectInCQThread(void);
};
//! Class Image2DD3D10 is derived from classes Image2D and D3D10Object
@@ -316,10 +308,6 @@ public:
setInteropObj(this);
}
virtual ~Image2DD3D10() {}
//! For CPU device only!
virtual bool mapExtObjectInCQThread(void);
virtual bool unmapExtObjectInCQThread(void);
};
//! Class Image3DD3D10 is derived from classes Image3D and D3D10Object
@@ -354,10 +342,6 @@ public:
setInteropObj(this);
}
virtual ~Image3DD3D10() {}
//! For CPU device only!
virtual bool mapExtObjectInCQThread(void);
virtual bool unmapExtObjectInCQThread(void);
};
//! Functions for executing the D3D10 related stuff
-344
ファイルの表示
@@ -962,114 +962,6 @@ void BufferD3D11::initDeviceMemory() {
memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory));
}
bool BufferD3D11::mapExtObjectInCQThread() {
D3D11_MAPPED_SUBRESOURCE mappedResource;
HRESULT hr;
D3D11_MAP gpuMap;
UINT cpuAccess;
if (getMemFlags() & CL_MEM_READ_WRITE) {
gpuMap = D3D11_MAP_READ_WRITE;
cpuAccess = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
} else if (getMemFlags() & CL_MEM_READ_ONLY) {
gpuMap = D3D11_MAP_READ;
cpuAccess = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
} else if (getMemFlags() & CL_MEM_WRITE_ONLY) {
gpuMap = D3D11_MAP_WRITE;
cpuAccess = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
} else {
// Should not get here, the flags had been checked before
LogError("\nInvalid memrory flags");
return false;
}
ID3D11Device* pD3D11Dev;
getD3D11Resource()->GetDevice(&pD3D11Dev);
if (!pD3D11Dev) {
LogError("\nCannot get D3D11 device");
return false;
}
pD3D11Dev->Release();
ID3D11DeviceContext* pImmediateContext = NULL;
pD3D11Dev->GetImmediateContext(&pImmediateContext);
if (!pImmediateContext) {
LogError("\nCannot get D3D11 device context");
return false;
}
pImmediateContext->Release();
if (getUsage() == D3D11_USAGE_STAGING) {
// XXX Christophe: Use DeviceContext to map
//// Can map directly
hr = pImmediateContext->Map(getD3D11Resource(), 0, gpuMap, 0, &mappedResource);
if (hr != S_OK || !mappedResource.pData) {
LogError("Cannot map ID3D11Buffer object to CPU memory");
return false;
}
} else {
// The buffer need to be mapped indirectly
// Create auxiliary buffer
D3D11_BUFFER_DESC bufDesc = {getResourceByteSize(), D3D11_USAGE_STAGING, 0, cpuAccess, 0};
ID3D11Buffer* pAuxBuf;
hr = pD3D11Dev->CreateBuffer(&bufDesc, NULL, &pAuxBuf);
if (hr != S_OK || !pAuxBuf) {
LogError("\nCannot create auxiliary buffer");
return false;
}
setD3D11AuxRes(pAuxBuf);
// Copy contents of original buffer to auxiliary
pImmediateContext->CopyResource(pAuxBuf, getD3D11Resource());
// Now map the aux buffer
hr = pImmediateContext->Map(pAuxBuf, 0, gpuMap, 0, &mappedResource);
if (hr != S_OK || !mappedResource.pData) {
LogError("Cannot map D3D11 auxiliary buffer to CPU memory");
return false;
}
}
setHostMem(mappedResource.pData);
return true;
}
bool BufferD3D11::unmapExtObjectInCQThread() {
ID3D11Device* pD3D11Dev;
getD3D11AuxRes()->GetDevice(&pD3D11Dev);
if (!pD3D11Dev) {
LogError("\nCannot get D3D11 device");
return false;
}
pD3D11Dev->Release();
ID3D11DeviceContext* pImmediateContext = NULL;
pD3D11Dev->GetImmediateContext(&pImmediateContext);
if (!pImmediateContext) {
LogError("\nCannot get D3D11 device context");
return false;
}
pImmediateContext->Release();
if (getMemFlags() & (CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY)) {
if (getD3D11AuxRes()) {
// Need to copy data from aux to original
pImmediateContext->Unmap(getD3D11AuxRes(), 0);
pImmediateContext->CopyResource(getD3D11Resource(), getD3D11AuxRes());
getD3D11AuxRes()->Release();
setD3D11AuxRes(NULL);
} else {
pImmediateContext->Unmap(getD3D11Resource(), 0);
}
} else {
// Just unmap everything, no need to copy contents
if (getD3D11AuxRes()) {
pImmediateContext->Unmap(getD3D11AuxRes(), 0);
getD3D11AuxRes()->Release();
setD3D11AuxRes(NULL);
} else {
pImmediateContext->Unmap(getD3D11Resource(), 0);
}
}
setHostMem(NULL);
return true;
}
//
// Class Image1DD3D11 implementation
//
@@ -1079,16 +971,6 @@ void Image1DD3D11::initDeviceMemory() {
memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory));
}
bool Image1DD3D11::mapExtObjectInCQThread() {
LogError("\nImage1DD3D11::mapExtObjectInCQThread() is not implemented yet\n");
return false;
}
bool Image1DD3D11::unmapExtObjectInCQThread() {
LogError("\nImage1DD3D11::unmapExtObjectInCQThread() is not implemented yet\n");
return false;
}
//
// Class Image2DD3D11 implementation
//
@@ -1099,119 +981,6 @@ void Image2DD3D11::initDeviceMemory() {
memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory));
}
bool Image2DD3D11::mapExtObjectInCQThread() {
D3D11_MAPPED_SUBRESOURCE texture2D;
HRESULT hr;
D3D11_MAP gpuMap;
UINT cpuAccess;
if (getMemFlags() & CL_MEM_READ_WRITE) {
gpuMap = D3D11_MAP_READ_WRITE;
cpuAccess = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
} else if (getMemFlags() & CL_MEM_READ_ONLY) {
gpuMap = D3D11_MAP_READ;
cpuAccess = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
} else if (getMemFlags() & CL_MEM_WRITE_ONLY) {
gpuMap = D3D11_MAP_WRITE;
cpuAccess = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
} else {
// Should not get here, the flags had been checked before
LogError("\nInvalid memrory flags");
return false;
}
ID3D11Device* pD3D11Dev;
getD3D11Resource()->GetDevice(&pD3D11Dev);
if (!pD3D11Dev) {
LogError("\nCannot get D3D11 device");
return false;
}
pD3D11Dev->Release();
ID3D11DeviceContext* pImmediateContext = NULL;
pD3D11Dev->GetImmediateContext(&pImmediateContext);
if (!pImmediateContext) {
LogError("\nCannot get D3D11 device context");
return false;
}
pImmediateContext->Release();
if (getUsage() == D3D11_USAGE_STAGING) {
// Can map directly
hr = pImmediateContext->Map(getD3D11Resource(), getSubresource(), gpuMap, 0, &texture2D);
if (hr != S_OK || !texture2D.pData) {
LogError("Cannot map ID3D11Texture2D object to CPU memory");
return false;
}
} else {
// The texture needs to be mapped indirectly.
// Create auxiliary texture.
D3D11_TEXTURE2D_DESC texDesc;
reinterpret_cast<ID3D11Texture2D*>(getD3D11Resource())->GetDesc(&texDesc);
texDesc.Usage = D3D11_USAGE_STAGING;
texDesc.MipLevels = 1;
texDesc.BindFlags = 0;
texDesc.CPUAccessFlags = cpuAccess;
texDesc.MiscFlags = 0;
ID3D11Texture2D* pAuxTex;
hr = pD3D11Dev->CreateTexture2D(&texDesc, NULL, &pAuxTex);
if (hr != S_OK) {
LogError("\nCannot create auxiliary 2D texture");
return false;
}
setD3D11AuxRes(pAuxTex);
// Copy contents of original texture to auxiliary
pImmediateContext->CopyResource(pAuxTex, getD3D11Resource());
// Now map the aux texture
hr = pImmediateContext->Map(pAuxTex, 0, gpuMap, 0, &texture2D);
if (hr != S_OK || !texture2D.pData) {
LogError("Cannot map D3D11 auxiliary 2D texture to CPU memory");
return false;
}
}
setHostMem(texture2D.pData);
return true;
}
bool Image2DD3D11::unmapExtObjectInCQThread() {
ID3D11Device* pD3D11Dev;
getD3D11AuxRes()->GetDevice(&pD3D11Dev);
if (!pD3D11Dev) {
LogError("\nCannot get D3D11 device");
return false;
}
pD3D11Dev->Release();
ID3D11DeviceContext* pImmediateContext = NULL;
pD3D11Dev->GetImmediateContext(&pImmediateContext);
if (!pImmediateContext) {
LogError("\nCannot get D3D11 device context");
return false;
}
pImmediateContext->Release();
if (getMemFlags() & (CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY)) {
if (getD3D11AuxRes()) {
// Need to copy data from aux to original
pImmediateContext->Unmap(getD3D11AuxRes(), 0);
pImmediateContext->CopyResource(getD3D11Resource(), getD3D11AuxRes());
getD3D11AuxRes()->Release();
setD3D11AuxRes(NULL);
} else {
pImmediateContext->Unmap(getD3D11Resource(), getSubresource());
}
} else {
// Just unmap everything, no need to copy contents
if (getD3D11AuxRes()) {
pImmediateContext->Unmap(getD3D11AuxRes(), 0);
getD3D11AuxRes()->Release();
setD3D11AuxRes(NULL);
} else {
pImmediateContext->Unmap(getD3D11Resource(), getSubresource());
}
}
setHostMem(NULL);
return true;
}
//
// Class Image3DD3D11 implementation
//
@@ -1221,119 +990,6 @@ void Image3DD3D11::initDeviceMemory() {
memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory));
}
bool Image3DD3D11::mapExtObjectInCQThread() {
D3D11_MAPPED_SUBRESOURCE texture3D;
HRESULT hr;
D3D11_MAP gpuMap;
UINT cpuAccess;
if (getMemFlags() & CL_MEM_READ_WRITE) {
gpuMap = D3D11_MAP_READ_WRITE;
cpuAccess = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
} else if (getMemFlags() & CL_MEM_READ_ONLY) {
gpuMap = D3D11_MAP_READ;
cpuAccess = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
} else if (getMemFlags() & CL_MEM_WRITE_ONLY) {
gpuMap = D3D11_MAP_WRITE;
cpuAccess = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
} else {
// Should not get here, the flags had been checked before
LogError("\nInvalid memrory flags");
return false;
}
ID3D11Device* pD3D11Dev;
getD3D11AuxRes()->GetDevice(&pD3D11Dev);
if (!pD3D11Dev) {
LogError("\nCannot get D3D11 device");
return false;
}
pD3D11Dev->Release();
ID3D11DeviceContext* pImmediateContext = NULL;
pD3D11Dev->GetImmediateContext(&pImmediateContext);
if (!pImmediateContext) {
LogError("\nCannot get D3D11 device context");
return false;
}
pImmediateContext->Release();
if (getUsage() == D3D11_USAGE_STAGING) {
// Can map directly
hr = pImmediateContext->Map(getD3D11Resource(), getSubresource(), gpuMap, 0, &texture3D);
if (hr != S_OK || !texture3D.pData) {
LogError("Cannot map ID3D11Texture3D object to CPU memory");
return false;
}
} else {
// The texture needs to be mapped indirectly.
// Create auxiliary texture.
D3D11_TEXTURE3D_DESC texDesc;
reinterpret_cast<ID3D11Texture3D*>(getD3D11Resource())->GetDesc(&texDesc);
texDesc.Usage = D3D11_USAGE_STAGING;
texDesc.MipLevels = 1;
texDesc.BindFlags = 0;
texDesc.CPUAccessFlags = cpuAccess;
texDesc.MiscFlags = 0;
ID3D11Texture3D* pAuxTex;
hr = pD3D11Dev->CreateTexture3D(&texDesc, NULL, &pAuxTex);
if (hr != S_OK) {
LogError("\nCannot create auxiliary 3D texture");
return false;
}
setD3D11AuxRes(pAuxTex);
// Copy contents of original texture to auxiliary
pImmediateContext->CopyResource(pAuxTex, getD3D11Resource());
// Now map the aux texture
hr = pImmediateContext->Map(pAuxTex, 0, gpuMap, 0, &texture3D);
if (hr != S_OK || !texture3D.pData) {
LogError("Cannot map D3D11 auxiliary 3D texture to CPU memory");
return false;
}
}
setHostMem(texture3D.pData);
return true;
}
bool Image3DD3D11::unmapExtObjectInCQThread() {
ID3D11Device* pD3D11Dev;
getD3D11AuxRes()->GetDevice(&pD3D11Dev);
if (!pD3D11Dev) {
LogError("\nCannot get D3D11 device");
return false;
}
pD3D11Dev->Release();
ID3D11DeviceContext* pImmediateContext = NULL;
pD3D11Dev->GetImmediateContext(&pImmediateContext);
if (!pImmediateContext) {
LogError("\nCannot get D3D11 device context");
return false;
}
pImmediateContext->Release();
if (getMemFlags() & (CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY)) {
if (getD3D11AuxRes()) {
// Need to copy data from aux to original
pImmediateContext->Unmap(getD3D11AuxRes(), 0);
pImmediateContext->CopyResource(getD3D11Resource(), getD3D11AuxRes());
getD3D11AuxRes()->Release();
setD3D11AuxRes(NULL);
} else {
pImmediateContext->Unmap(getD3D11Resource(), getSubresource());
}
} else {
// Just unmap everything, no need to copy contents
if (getD3D11AuxRes()) {
pImmediateContext->Unmap(getD3D11AuxRes(), 0);
getD3D11AuxRes()->Release();
setD3D11AuxRes(NULL);
} else {
pImmediateContext->Unmap(getD3D11Resource(), getSubresource());
}
}
setHostMem(NULL);
return true;
}
//
// Helper function SyncD3D11Objects
//
-16
ファイルの表示
@@ -251,10 +251,6 @@ public:
setInteropObj(this);
}
virtual ~BufferD3D11() {}
//! For CPU device only!
virtual bool mapExtObjectInCQThread(void);
virtual bool unmapExtObjectInCQThread(void);
};
//! Class Image1DD3D11 is derived from classes Image1D and D3D11Object
@@ -289,10 +285,6 @@ public:
setInteropObj(this);
}
virtual ~Image1DD3D11() {}
//! For CPU device only!
virtual bool mapExtObjectInCQThread(void);
virtual bool unmapExtObjectInCQThread(void);
};
//! Class Image2DD3D11 is derived from classes Image2D and D3D11Object
@@ -327,10 +319,6 @@ public:
setInteropObj(this);
}
virtual ~Image2DD3D11() {}
//! For CPU device only!
virtual bool mapExtObjectInCQThread(void);
virtual bool unmapExtObjectInCQThread(void);
};
//! Class Image3DD3D11 is derived from classes Image3D and D3D11Object
@@ -365,10 +353,6 @@ public:
setInteropObj(this);
}
virtual ~Image3DD3D11() {}
//! For CPU device only!
virtual bool mapExtObjectInCQThread(void);
virtual bool unmapExtObjectInCQThread(void);
};
//! Functions for executing the D3D11 related stuff
-42
ファイルの表示
@@ -816,48 +816,6 @@ void Image2DD3D9::initDeviceMemory() {
memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory));
}
bool Image2DD3D9::mapExtObjectInCQThread() {
void* pCpuMem = NULL;
HRESULT hr;
DWORD lockFlags = 0;
if (getMemFlags() & CL_MEM_READ_WRITE) {
lockFlags = 0;
} else if (getMemFlags() & CL_MEM_READ_ONLY) {
lockFlags = D3DLOCK_READONLY;
} else if (getMemFlags() & CL_MEM_WRITE_ONLY) {
lockFlags = D3DLOCK_DISCARD;
} else {
// Should not get here, the flags had been checked before
LogError("\nInvalid memrory flags");
return false;
}
ScopedLock sl(getResLock());
D3DLOCKED_RECT lockedRect;
hr = getD3D9Resource()->LockRect(&lockedRect, NULL, lockFlags);
if ((hr != D3D_OK) || !lockedRect.pBits) {
LogError("Cannot lock D3D9 surface for CPU access");
return false;
}
setHostMem(lockedRect.pBits);
return true;
}
bool Image2DD3D9::unmapExtObjectInCQThread() {
HRESULT hr;
ScopedLock sl(getResLock());
hr = getD3D9Resource()->UnlockRect();
if (hr != D3D_OK) {
LogError("Cannot unlock D3D9 surface");
return false;
}
setHostMem(NULL);
return true;
}
} // namespace amd
#endif //_WIN32
-4
ファイルの表示
@@ -311,10 +311,6 @@ public:
setInteropObj(this);
}
virtual ~Image2DD3D9() {}
//! For CPU device only!
virtual bool mapExtObjectInCQThread(void);
virtual bool unmapExtObjectInCQThread(void);
};
cl_mem clCreateImage2DFromD3D9ResourceAMD(
+9 -163
ファイルの表示
@@ -814,9 +814,7 @@ RUNTIME_ENTRY(cl_int, clGetGLContextInfoKHR,
size_t param_value_size, void* param_value, size_t* param_value_size_ret)) {
cl_int errcode;
cl_device_id* gpu_devices;
cl_device_id* cpu_devices;
cl_uint num_gpu_devices = 0;
cl_uint num_cpu_devices = 0;
amd::Context::Info info;
static const bool VALIDATE_ONLY = true;
@@ -835,12 +833,8 @@ RUNTIME_ENTRY(cl_int, clGetGLContextInfoKHR,
if (errcode != CL_SUCCESS && errcode != CL_DEVICE_NOT_FOUND) {
return CL_INVALID_VALUE;
}
errcode = clGetDeviceIDs(NULL, CL_DEVICE_TYPE_CPU, 0, NULL, &num_cpu_devices);
if (errcode != CL_SUCCESS && errcode != CL_DEVICE_NOT_FOUND) {
return CL_INVALID_VALUE;
}
if (!num_gpu_devices && !num_cpu_devices) {
if (!num_gpu_devices) {
return CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR;
}
@@ -865,25 +859,17 @@ RUNTIME_ENTRY(cl_int, clGetGLContextInfoKHR,
}
*not_null(param_value_size_ret) = 0;
} else {
cpu_devices = (cl_device_id*)alloca(num_cpu_devices * sizeof(cl_device_id));
errcode = clGetDeviceIDs(NULL, CL_DEVICE_TYPE_CPU, num_cpu_devices, cpu_devices, NULL);
if (errcode != CL_SUCCESS) {
return errcode;
}
return amd::clGetInfo(cpu_devices[0], param_value_size, param_value, param_value_size_ret);
}
break;
case CL_DEVICES_FOR_GL_CONTEXT_KHR: {
// List of all CL devices that can be associated with the specified OpenGL context.
cl_uint total_devices = num_gpu_devices + num_cpu_devices;
cl_uint total_devices = num_gpu_devices;
size_t size = total_devices * sizeof(cl_device_id);
cl_device_id* devices = (cl_device_id*)alloca(size);
errcode = clGetDeviceIDs(NULL, CL_DEVICE_TYPE_GPU | CL_DEVICE_TYPE_CPU, total_devices,
errcode = clGetDeviceIDs(NULL, CL_DEVICE_TYPE_GPU, total_devices,
devices, NULL);
if (errcode != CL_SUCCESS) {
return errcode;
@@ -1310,58 +1296,6 @@ void BufferGL::initDeviceMemory() {
memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory));
}
bool BufferGL::mapExtObjectInCQThread() {
assert(!context_().glenv()->isEGL());
GLFunctions::SetIntEnv ie(context_().glenv());
if (!ie.isValid()) {
return false;
}
GLenum glAccess = GL_READ_WRITE; // Default
if (getMemFlags() & CL_MEM_READ_ONLY) {
glAccess = GL_READ_ONLY;
} else if (getMemFlags() & CL_MEM_WRITE_ONLY) {
glAccess = GL_WRITE_ONLY;
}
clearGLErrors(context_());
context_().glenv()->glBindBuffer_(GL_ARRAY_BUFFER, gluiName_);
void* pCpuMem = context_().glenv()->glMapBuffer_(GL_ARRAY_BUFFER, glAccess);
if (checkForGLError(context_()) != GL_NO_ERROR || !pCpuMem) {
LogError("cannot map GL buffer");
return false;
}
setHostMem(pCpuMem);
return true;
}
bool BufferGL::unmapExtObjectInCQThread() {
assert(!context_().glenv()->isEGL());
GLFunctions::SetIntEnv ie(context_().glenv());
if (!ie.isValid()) {
return false;
}
clearGLErrors(context_());
context_().glenv()->glBindBuffer_(GL_ARRAY_BUFFER, gluiName_);
if (GL_FALSE == context_().glenv()->glUnmapBuffer_(GL_ARRAY_BUFFER)) {
LogError("context_().glenv()->glUnmapBuffer_ returned GL_FALSE - buffer may be corrupted");
return false;
}
if (checkForGLError(context_()) != GL_NO_ERROR) {
LogWarning("Error unmapping GL buffer");
return false;
}
setHostMem(NULL);
return true;
}
static GLenum clChannelDataTypeToGlType(cl_channel_type channel_type) {
// Pick
// GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT,
@@ -1433,92 +1367,6 @@ void ImageGL::initDeviceMemory() {
memset(deviceMemories_, 0, context_().devices().size() * sizeof(DeviceMemory));
}
bool ImageGL::mapExtObjectInCQThread() {
assert(!context_().glenv()->isEGL());
GLFunctions::SetIntEnv ie(context_().glenv());
if (!ie.isValid()) {
return false;
}
GLenum glAccess = GL_READ_WRITE; // Default
if (getMemFlags() & CL_MEM_READ_ONLY) {
glAccess = GL_READ_ONLY;
} else if (getMemFlags() & CL_MEM_WRITE_ONLY) {
glAccess = GL_WRITE_ONLY;
}
clearGLErrors(context_());
context_().glenv()->glBindTexture_(getGLTarget(), gluiName_);
size_t mem_size = getSize();
char* pCpuMem = new char[mem_size];
if (pCpuMem == NULL) {
LogError("Cannot alloc host memory for ImageGL");
return false;
}
context_().glenv()->glGetTexImage_(
getGLTarget(), gliMipLevel_, glInternalFormatToGlFormat(glInternalFormat_),
clChannelDataTypeToGlType(getImageFormat().image_channel_data_type), pCpuMem);
if (checkForGLError(context_()) != GL_NO_ERROR) {
LogError("cannot map GL texture");
delete[] pCpuMem;
return false;
}
setHostMem(pCpuMem);
return true;
}
bool ImageGL::unmapExtObjectInCQThread() {
assert(!context_().glenv()->isEGL());
GLFunctions::SetIntEnv ie(context_().glenv());
if (!ie.isValid()) {
return false;
}
bool status = true;
clearGLErrors(context_());
context_().glenv()->glBindTexture_(getGLTarget(), gluiName_);
char* pCpuMem = (char*)getHostMem();
if (checkForGLError(context_()) != GL_NO_ERROR) {
LogError("Cannot map GL texture");
status = false;
goto cleanup;
}
context_().glenv()->glTexImage2D_(
getGLTarget(), // target
gliMipLevel_, // miplevel
glInternalFormat_, // internalFormat or bytes per pixel
gliWidth_, // width
gliHeight_, // height
0, // border
// format
glInternalFormatToGlFormat(glInternalFormat_),
// type
clChannelDataTypeToGlType(getImageFormat().image_channel_data_type),
pCpuMem); // data
if (checkForGLError(context_()) != GL_NO_ERROR) {
LogError("Cannot update GL texture");
status = false;
goto cleanup;
}
cleanup:
delete[] pCpuMem;
setHostMem(NULL);
return status;
}
//*******************************************************************
//
// Internal implementation of CL API functions
@@ -1615,15 +1463,13 @@ cl_mem clCreateFromGLBufferAMD(Context& amdContext, cl_mem_flags flags, GLuint b
const auto it = amdContext.devices().cbegin();
const amd::Device& dev = *(*it);
if (dev.type() != CL_DEVICE_TYPE_CPU) {
device::Memory* mem = pBufferGL->getDeviceMemory(dev);
if (NULL == mem) {
LogPrintfError("Can't allocate memory size - 0x%08X bytes!", pBufferGL->getSize());
*not_null(errcode_ret) = CL_INVALID_GL_OBJECT;
return (cl_mem)0;
}
mem->processGLResource(device::Memory::GLDecompressResource);
device::Memory* mem = pBufferGL->getDeviceMemory(dev);
if (NULL == mem) {
LogPrintfError("Can't allocate memory size - 0x%08X bytes!", pBufferGL->getSize());
*not_null(errcode_ret) = CL_INVALID_GL_OBJECT;
return (cl_mem)0;
}
mem->processGLResource(device::Memory::GLDecompressResource);
return as_cl<Memory>(pBufferGL);
}
-8
ファイルの表示
@@ -131,10 +131,6 @@ public:
virtual ~BufferGL() {}
virtual BufferGL* asBufferGL() { return this; }
//! For CPU device only!
virtual bool mapExtObjectInCQThread(void);
virtual bool unmapExtObjectInCQThread(void);
};
@@ -173,10 +169,6 @@ public:
virtual ~ImageGL() {}
//! For CPU device only!
virtual bool mapExtObjectInCQThread(void);
virtual bool unmapExtObjectInCQThread(void);
protected:
//! Initializes the device memory array which is nested
// after'BufferGL' object in memory layout.