// // Copyright (c) 2017 The Khronos Group Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "harness.h" void SubTestMiscMultipleCreates( cl_context context, cl_command_queue command_queue, ID3D10Device* pDevice) { ID3D10Buffer* pBuffer = NULL; ID3D10Texture2D* pTexture = NULL; HRESULT hr = S_OK; cl_mem mem[5] = {NULL, NULL, NULL, NULL, NULL}; cl_int result = CL_SUCCESS; HarnessD3D10_TestBegin("Misc: Multiple Creates"); // create the D3D10 resources { D3D10_TEXTURE2D_DESC desc; memset(&desc, 0, sizeof(desc) ); desc.Width = 256; desc.Height = 256; desc.MipLevels = 4; desc.ArraySize = 4; desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Usage = D3D10_USAGE_DEFAULT; desc.BindFlags = D3D10_BIND_SHADER_RESOURCE | D3D10_BIND_RENDER_TARGET; desc.CPUAccessFlags = 0; desc.MiscFlags = 0; hr = pDevice->CreateTexture2D(&desc, NULL, &pTexture); TestRequire(SUCCEEDED(hr), "Failed to create texture."); } // create the D3D10 buffer { D3D10_BUFFER_DESC desc = {0}; desc.ByteWidth = 1024; desc.Usage = D3D10_USAGE_DEFAULT; desc.CPUAccessFlags = 0; desc.BindFlags = D3D10_BIND_VERTEX_BUFFER; desc.MiscFlags = 0; hr = pDevice->CreateBuffer(&desc, NULL, &pBuffer); TestRequire(SUCCEEDED(hr), "Creating vertex buffer failed!"); } mem[0] = clCreateFromD3D10BufferKHR( context, 0, pBuffer, &result); TestRequire(result == CL_SUCCESS, "clCreateFromD3D10BufferKHR"); mem[1] = clCreateFromD3D10BufferKHR( context, 0, pBuffer, &result); TestRequire(result == CL_INVALID_D3D10_RESOURCE_KHR, "clCreateFromD3D10BufferKHR succeeded when it shouldn't"); mem[2] = clCreateFromD3D10Texture2DKHR( context, 0, pTexture, 1, &result); TestRequire(result == CL_SUCCESS, "clCreateFromD3D10Texture2DKHR failed"); mem[3] = clCreateFromD3D10Texture2DKHR( context, 0, pTexture, 1, &result); TestRequire(result == CL_INVALID_D3D10_RESOURCE_KHR, "clCreateFromD3D10Texture2DKHR succeeded when it shouldn't"); mem[4] = clCreateFromD3D10Texture2DKHR( context, 0, pTexture, 16, &result); TestRequire(result == CL_INVALID_VALUE, "clCreateFromD3D10Texture2DKHR succeeded when it shouldn't"); Cleanup: for (UINT i = 0; i < 4; ++i) { if (mem[i]) { clReleaseMemObject(mem[i]); } } if (pBuffer) { pBuffer->Release(); } if (pTexture) { pTexture->Release(); } HarnessD3D10_TestEnd(); } void SubTestMiscAcquireRelease( cl_context context, cl_command_queue command_queue, ID3D10Device* pDevice) { ID3D10Buffer* pBuffer = NULL; ID3D10Texture2D* pTexture = NULL; HRESULT hr = S_OK; cl_int result = CL_SUCCESS; cl_mem mem[2] = {NULL, NULL}; HarnessD3D10_TestBegin("Misc: Acquire Release"); // create the D3D10 resources { D3D10_TEXTURE2D_DESC desc; memset(&desc, 0, sizeof(desc) ); desc.Width = 256; desc.Height = 256; desc.MipLevels = 4; desc.ArraySize = 4; desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Usage = D3D10_USAGE_DEFAULT; desc.BindFlags = D3D10_BIND_SHADER_RESOURCE | D3D10_BIND_RENDER_TARGET; desc.CPUAccessFlags = 0; desc.MiscFlags = 0; hr = pDevice->CreateTexture2D(&desc, NULL, &pTexture); TestRequire(SUCCEEDED(hr), "Failed to create texture."); } // create the D3D10 buffer { D3D10_BUFFER_DESC desc = {0}; desc.ByteWidth = 1024; desc.Usage = D3D10_USAGE_DEFAULT; desc.CPUAccessFlags = 0; desc.BindFlags = D3D10_BIND_VERTEX_BUFFER; desc.MiscFlags = 0; hr = pDevice->CreateBuffer(&desc, NULL, &pBuffer); TestRequire(SUCCEEDED(hr), "Creating vertex buffer failed!"); } // create cl_mem objects for the resources mem[0] = clCreateFromD3D10BufferKHR( context, 0, pBuffer, &result); TestRequire(result == CL_SUCCESS, "clCreateFromD3D10BufferKHR"); mem[1] = clCreateFromD3D10Texture2DKHR( context, 0, pTexture, 1, &result); TestRequire(result == CL_SUCCESS, "clCreateFromD3D10Texture2DKHR failed"); // test some acquire/release patterns result = clEnqueueAcquireD3D10ObjectsKHR( command_queue, 1, &mem[1], 0, NULL, NULL); TestRequire(result == CL_SUCCESS, "clEnqueueAcquireD3D10ObjectsKHR failed."); result = clEnqueueAcquireD3D10ObjectsKHR( command_queue, 1, &mem[0], 0, NULL, NULL); TestRequire(result == CL_SUCCESS, "clEnqueueAcquireD3D10ObjectsKHR failed."); result = clEnqueueReleaseD3D10ObjectsKHR( command_queue, 1, &mem[1], 0, NULL, NULL); TestRequire(result == CL_SUCCESS, "clEnqueueReleaseD3D10ObjectsKHR failed."); result = clEnqueueReleaseD3D10ObjectsKHR( command_queue, 1, &mem[0], 0, NULL, NULL); TestRequire(result == CL_SUCCESS, "clEnqueueReleaseD3D10ObjectsKHR failed."); Cleanup: for (UINT i = 0; i < 2; ++i) { if (mem[i]) { clReleaseMemObject(mem[i]); } } if (pBuffer) { pBuffer->Release(); } if (pTexture) { pTexture->Release(); } HarnessD3D10_TestEnd(); } void TestDeviceMisc( cl_device_id device, cl_context context, cl_command_queue command_queue, ID3D10Device* pDevice) { SubTestMiscMultipleCreates( context, command_queue, pDevice); SubTestMiscAcquireRelease( context, command_queue, pDevice); }