実現したいこと
デスクトップをキャプチャした画像を共有ハンドルを用いてCUDAに登録したソースSurfaceとNV12フォーマットから作ったY面とUV面のsurfaceにカーネルを用いてRGBAからNV12への変換とリサイズを同時に行いたい
発生している問題・分からないこと
CUDAカーネルでY面とUV面にデータがかきこまれない
エラーメッセージ
error
1エラーメッセージは特になし 2 3エラハンドリングで特にエラーをはいていない
該当のソースコード
C++
1 D3D12_RESOURCE_DESC desc12NV12 = {}; 2 desc12NV12.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; 3 desc12NV12.Alignment = 0; 4 desc12NV12.Width = targetWidth; 5 desc12NV12.Height = targetHeight; 6 desc12NV12.DepthOrArraySize = 1; 7 desc12NV12.MipLevels = 1; 8 desc12NV12.Format = DXGI_FORMAT_NV12; 9 desc12NV12.SampleDesc.Count = 1; 10 desc12NV12.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; 11 desc12NV12.Flags = D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS; 12 13 // ヒープ設定は同一 GPU 内共有のみ 14 D3D12_HEAP_PROPERTIES heapNV12 = {}; 15 heapNV12.Type = D3D12_HEAP_TYPE_DEFAULT; 16 heapNV12.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; 17 heapNV12.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; 18 19 D3D11_RESOURCE_FLAGS d3d11FlagsNV12 = {}; 20 d3d11FlagsNV12.MiscFlags = D3D11_RESOURCE_MISC_SHARED | D3D11_RESOURCE_MISC_SHARED_NTHANDLE; 21 22 hr = compatDev->CreateSharedResource( 23 &heapNV12, 24 D3D12_HEAP_FLAG_SHARED, 25 &desc12NV12, 26 D3D12_RESOURCE_STATE_COMMON, 27 nullptr, 28 &d3d11FlagsNV12, 29 D3D12_COMPATIBILITY_SHARED_FLAG_NONE, 30 nullptr, nullptr, 31 __uuidof(ID3D12Resource), 32 reinterpret_cast<void**>(context.d3d12NV12Res.GetAddressOf()) 33 ); 34 if (FAILED(hr)) { 35 DebugLog(L"Failed to Create SharedResource(NV12)."); 36 return; 37 } 38 39 HANDLE sharedHandleNV12 = nullptr; 40 SECURITY_ATTRIBUTES saNV12{}; 41 saNV12.nLength = sizeof(saNV12); 42 saNV12.bInheritHandle = FALSE; 43 saNV12.lpSecurityDescriptor = nullptr; 44 45 hr = d3d12Device->CreateSharedHandle( 46 context.d3d12NV12Res.Get(), 47 &saNV12, 48 GENERIC_ALL, 49 nullptr, 50 &sharedHandleNV12 51 ); 52 if (FAILED(hr)) { 53 DebugLog(L"Failed to Create sharedHandle(NV12)."); 54 return; 55 } 56 57 D3D12_RESOURCE_DESC desc = context.d3d12NV12Res->GetDesc(); 58 59 // 2) 実際のアロケーションサイズを取得 60 D3D12_RESOURCE_ALLOCATION_INFO allocInfo = 61 d3d12Device->GetResourceAllocationInfo( 62 0, // visibleMask(通常 0) 63 1, // リソース個数 64 &desc // リソース記述へのポインタ 65 ); 66 UINT64 resourceSize = allocInfo.SizeInBytes; 67 68 DebugLog(L"external buffer size : " + std::to_wstring(resourceSize)); 69 70 CUDA_EXTERNAL_MEMORY_HANDLE_DESC extDescNV12 = {}; 71 extDescNV12.type = CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE; 72 extDescNV12.handle.win32.handle = sharedHandleNV12; 73 extDescNV12.size = resourceSize; 74 extDescNV12.flags = CUDA_EXTERNAL_MEMORY_DEDICATED; 75 76 err = cuImportExternalMemory(&context.extMemNV12, &extDescNV12); 77 if (err != CUDA_SUCCESS) { 78 DebugLog(L"cuImportExternalMemory(NV12) failed"); 79 return; 80 } 81 82 CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC descY = {}; 83 descY.offset = 0; // Y は先頭 84 descY.numLevels = 1; 85 descY.arrayDesc.Width = targetWidth; 86 descY.arrayDesc.Height = targetHeight; 87 descY.arrayDesc.Depth = 0; 88 descY.arrayDesc.Format = CU_AD_FORMAT_UNSIGNED_INT8; 89 descY.arrayDesc.NumChannels = 1; // Y のみ 90 descY.arrayDesc.Flags = CUDA_ARRAY3D_SURFACE_LDST; 91 92 CUmipmappedArray mipY; 93 err = cuExternalMemoryGetMappedMipmappedArray(&mipY, context.extMemNV12, &descY); 94 if (err != CUDA_SUCCESS) { 95 DebugLog(L"cuExternalMemoryGetMappedMipmappedArray(Y) failed"); 96 cuDestroyExternalMemory(context.extMem); 97 CloseHandle(sharedHandle); 98 context.sharedD3D12Tex.Reset(); 99 cuDestroyExternalMemory(context.extMemNV12); 100 CloseHandle(sharedHandleNV12); 101 context.d3d12NV12Res.Reset(); 102 return; 103 } 104 105 CUarray arrY; 106 err = cuMipmappedArrayGetLevel(&arrY, mipY, 0); 107 if (err != CUDA_SUCCESS) { 108 DebugLog(L"cuMipmappedArrayGetLevel(Y) failed"); 109 cuDestroyExternalMemory(context.extMem); 110 CloseHandle(sharedHandle); 111 context.sharedD3D12Tex.Reset(); 112 cuDestroyExternalMemory(context.extMemNV12); 113 CloseHandle(sharedHandleNV12); 114 context.d3d12NV12Res.Reset(); 115 return; 116 } 117 118 CUDA_RESOURCE_DESC resDescY = {}; 119 resDescY.resType = CU_RESOURCE_TYPE_ARRAY; 120 resDescY.res.array.hArray = arrY; 121 resDescY.flags = 0; 122 123 err = cuSurfObjectCreate(&context.surfObjY, &resDescY); 124 if (err != CUDA_SUCCESS) { 125 DebugLog(L"cuSurfObjectCreate(Y) failed"); 126 cuDestroyExternalMemory(context.extMem); 127 CloseHandle(sharedHandle); 128 context.sharedD3D12Tex.Reset(); 129 cuDestroyExternalMemory(context.extMemNV12); 130 CloseHandle(sharedHandleNV12); 131 context.d3d12NV12Res.Reset(); 132 return; 133 } 134 135 // 2) UV プレーン用サーフェス 136 137 CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC descUV = {}; 138 descUV.offset = 0; 139 descUV.numLevels = 1; 140 descUV.arrayDesc.Width = targetWidth / 2; 141 descUV.arrayDesc.Height = targetHeight / 2; 142 descUV.arrayDesc.Depth = 0; 143 descUV.arrayDesc.Format = CU_AD_FORMAT_UNSIGNED_INT8; 144 descUV.arrayDesc.NumChannels = 2; 145 descUV.arrayDesc.Flags = CUDA_ARRAY3D_SURFACE_LDST; // U,V インターリーブ 146 147 CUmipmappedArray mipUV; 148 err = cuExternalMemoryGetMappedMipmappedArray(&mipUV, context.extMemNV12, &descUV); 149 if (err != CUDA_SUCCESS) { 150 const char* name = nullptr; 151 cuGetErrorName(err, &name); 152 DebugLog(L"cuExternalMemoryGetMappedMipmappedArray(UV) failed: " + std::wstring(name, name + strlen(name))); 153 cuDestroyExternalMemory(context.extMem); 154 CloseHandle(sharedHandle); 155 context.sharedD3D12Tex.Reset(); 156 cuDestroyExternalMemory(context.extMemNV12); 157 CloseHandle(sharedHandleNV12); 158 context.d3d12NV12Res.Reset(); 159 return; 160 } 161 162 CUarray arrUV; 163 err = cuMipmappedArrayGetLevel(&arrUV, mipUV, 0); 164 if (err != CUDA_SUCCESS) { 165 DebugLog(L"cuMipmappedArrayGetLevel(UV) failed"); 166 cuDestroyExternalMemory(context.extMem); 167 CloseHandle(sharedHandle); 168 context.sharedD3D12Tex.Reset(); 169 cuDestroyExternalMemory(context.extMemNV12); 170 CloseHandle(sharedHandleNV12); 171 context.d3d12NV12Res.Reset(); 172 return; 173 } 174 175 CUDA_RESOURCE_DESC resDescUV = resDescY; 176 resDescUV.res.array.hArray = arrUV; 177; 178 err = cuSurfObjectCreate(&context.surfObjUV, &resDescUV); 179 if (err != CUDA_SUCCESS) { 180 DebugLog(L"cuSurfObjectCreate(UV) failed"); 181 cuDestroyExternalMemory(context.extMem); 182 CloseHandle(sharedHandle); 183 context.sharedD3D12Tex.Reset(); 184 cuDestroyExternalMemory(context.extMemNV12); 185 CloseHandle(sharedHandleNV12); 186 context.d3d12NV12Res.Reset(); 187 return; 188 }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
生成AIでY面にクレースケールでグラデーションを書き、UとVはグレーを書き込むCUDAカーネルを作ってもらい試したが結果一緒だった
補足
特になし

あなたの回答
tips
プレビュー