Exemple #1
0
        static void CleanupResources()
        {
            D3D11Utils.ReleaseAndNull(ref g_pBuf0SRV);
            D3D11Utils.ReleaseAndNull(ref g_pBuf1SRV);
            D3D11Utils.ReleaseAndNull(ref g_pBufResultUAV);
            D3D11Utils.ReleaseAndNull(ref g_pBuf0);
            D3D11Utils.ReleaseAndNull(ref g_pBuf1);
            D3D11Utils.ReleaseAndNull(ref g_pBufResult);
            D3D11Utils.ReleaseAndNull(ref g_pCS);

            deviceResources?.Release();
            deviceResources = null;
        }
Exemple #2
0
        static void CleanupResources()
        {
            D3D11Utils.ReleaseAndNull(ref g_pReadBackBuffer);
            D3D11Utils.ReleaseAndNull(ref g_pBuffer2UAV);
            D3D11Utils.ReleaseAndNull(ref g_pBuffer1UAV);
            D3D11Utils.ReleaseAndNull(ref g_pBuffer2SRV);
            D3D11Utils.ReleaseAndNull(ref g_pBuffer1SRV);
            D3D11Utils.ReleaseAndNull(ref g_pBuffer2);
            D3D11Utils.ReleaseAndNull(ref g_pBuffer1);
            D3D11Utils.ReleaseAndNull(ref g_pCB);
            D3D11Utils.ReleaseAndNull(ref g_pComputeShaderTranspose);
            D3D11Utils.ReleaseAndNull(ref g_pComputeShaderBitonic);

            deviceResources.Release();
            deviceResources = null;
        }
Exemple #3
0
        static void Main(string[] args)
        {
            try
            {
                Console.Write("Creating device...");
                CreateComputeDevice();
                Console.WriteLine("done");

                Console.Write("Creating Compute Shader...");
                CreateComputeShader();
                Console.WriteLine("done");

                Console.Write("Creating buffers and filling them with initial data...");

                for (int i = 0; i < NUM_ELEMENTS; ++i)
                {
                    g_vBuf0[i].i = i;
                    g_vBuf0[i].f = (float)i;
#if TEST_DOUBLE
                    g_vBuf0[i].d = (double)i;
#endif

                    g_vBuf1[i].i = i;
                    g_vBuf1[i].f = (float)i;
#if TEST_DOUBLE
                    g_vBuf1[i].d = (double)i;
#endif
                }

#if USE_STRUCTURED_BUFFERS
                g_pBuf0      = CreateStructuredBuffer(deviceResources.D3DDevice, g_vBuf0);
                g_pBuf1      = CreateStructuredBuffer(deviceResources.D3DDevice, g_vBuf1);
                g_pBufResult = CreateStructuredBuffer(deviceResources.D3DDevice, new BufType[NUM_ELEMENTS]);
#else
                g_pBuf0      = CreateRawBuffer(deviceResources.D3DDevice, g_vBuf0);
                g_pBuf1      = CreateRawBuffer(deviceResources.D3DDevice, g_vBuf1);
                g_pBufResult = CreateRawBuffer(deviceResources.D3DDevice, new BufType[NUM_ELEMENTS]);
#endif

#if DEBUG
                g_pBuf0?.SetDebugName("Buffer0");
                g_pBuf1?.SetDebugName("Buffer1");
                g_pBufResult?.SetDebugName("Result");
#endif

                Console.WriteLine("done");

                Console.Write("Creating buffer views...");
                g_pBuf0SRV      = CreateBufferSRV(deviceResources.D3DDevice, g_pBuf0);
                g_pBuf1SRV      = CreateBufferSRV(deviceResources.D3DDevice, g_pBuf1);
                g_pBufResultUAV = CreateBufferUAV(deviceResources.D3DDevice, g_pBufResult);

#if DEBUG
                g_pBuf0SRV?.SetDebugName("Buffer0 SRV");
                g_pBuf1SRV?.SetDebugName("Buffer1 SRV");
                g_pBufResultUAV?.SetDebugName("Result UAV");
#endif

                Console.WriteLine("done");

                Console.Write("Running Compute Shader...");
                RunComputeShader(deviceResources.D3DContext, g_pCS, new[] { g_pBuf0SRV, g_pBuf1SRV }, g_pBufResultUAV, NUM_ELEMENTS, 1, 1);
                Console.WriteLine("done");

                // Read back the result from GPU, verify its correctness against result computed by CPU
                D3D11Buffer debugbuf = CreateAndCopyToDebugBuf(deviceResources.D3DDevice, deviceResources.D3DContext, g_pBufResult);

                try
                {
                    D3D11MappedSubResource mappedResource = deviceResources.D3DContext.Map(debugbuf, 0, D3D11MapCpuPermission.Read, D3D11MapOptions.None);

                    try
                    {
                        // Set a break point here and put down the expression "p, 1024" in your watch window to see what has been written out by our CS
                        // This is also a common trick to debug CS programs.

                        // Verify that if Compute Shader has done right
                        Console.Write("Verifying against CPU result...");
                        bool bSuccess = true;

                        for (int i = 0; i < NUM_ELEMENTS; ++i)
                        {
                            BufType p = Marshal.PtrToStructure <BufType>(mappedResource.Data + i * (int)BufType.Size);

                            if ((p.i != g_vBuf0[i].i + g_vBuf1[i].i) ||
                                (p.f != g_vBuf0[i].f + g_vBuf1[i].f)
#if TEST_DOUBLE
                                || (p.d != g_vBuf0[i].d + g_vBuf1[i].d)
#endif
                                )
                            {
                                Console.WriteLine("failure");
                                bSuccess = false;
                                break;
                            }
                        }

                        if (bSuccess)
                        {
                            Console.WriteLine("succeeded");
                        }
                    }
                    finally
                    {
                        deviceResources.D3DContext.Unmap(debugbuf, 0);
                    }
                }
                finally
                {
                    D3D11Utils.ReleaseAndNull(ref debugbuf);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            finally
            {
                Console.Write("Cleaning up...");
                CleanupResources();
                Console.WriteLine("done");
            }

            Console.ReadKey(false);
        }