using namespace cv::ocl;
//! @addtogroup core_directx
+// This section describes OpenCL and DirectX interoperability.
+//
+// To enable DirectX support, configure OpenCV using CMake with WITH_DIRECTX=ON . Note, DirectX is
+// supported only on Windows.
+//
+// To use OpenCL functionality you should first initialize OpenCL context from DirectX resource.
+//
//! @{
// TODO static functions in the Context class
return -1;
}
+ m_timer.start();
+
switch (m_mode)
{
case MODE_CPU:
UINT subResource = ::D3D10CalcSubresource(0, 0, 1);
D3D10_MAPPED_TEXTURE2D mappedTex;
- r = m_pSurface->Map(subResource, D3D10_MAP_WRITE_DISCARD, 0, &mappedTex);
+ r = pSurface->Map(subResource, D3D10_MAP_WRITE_DISCARD, 0, &mappedTex);
if (FAILED(r))
{
return r;
cv::blur(m, m, cv::Size(15, 15), cv::Point(-7, -7));
}
- m_pSurface->Unmap(subResource);
+ cv::String strMode = cv::format("%s", m_modeStr[MODE_CPU].c_str());
+ cv::String strProcessing = m_demo_processing ? "blur frame" : "copy frame";
+ cv::String strFPS = cv::format("%2.1f", m_timer.fps());
+ cv::String strDevName = cv::format("%s", m_oclDevName.c_str());
+
+ cv::putText(m, strMode, cv::Point(0, 16), 1, 0.8, cv::Scalar(0, 0, 0));
+ cv::putText(m, strProcessing, cv::Point(0, 32), 1, 0.8, cv::Scalar(0, 0, 0));
+ cv::putText(m, strFPS, cv::Point(0, 48), 1, 0.8, cv::Scalar(0, 0, 0));
+ cv::putText(m, strDevName, cv::Point(0, 64), 1, 0.8, cv::Scalar(0, 0, 0));
+
+ pSurface->Unmap(subResource);
break;
}
cv::blur(u, u, cv::Size(15, 15), cv::Point(-7, -7));
}
+ cv::String strMode = cv::format("%s", m_modeStr[MODE_GPU].c_str());
+ cv::String strProcessing = m_demo_processing ? "blur frame" : "copy frame";
+ cv::String strFPS = cv::format("%2.1f", m_timer.fps());
+ cv::String strDevName = cv::format("%s", m_oclDevName.c_str());
+
+ cv::putText(u, strMode, cv::Point(0, 16), 1, 0.8, cv::Scalar(0, 0, 0));
+ cv::putText(u, strProcessing, cv::Point(0, 32), 1, 0.8, cv::Scalar(0, 0, 0));
+ cv::putText(u, strFPS, cv::Point(0, 48), 1, 0.8, cv::Scalar(0, 0, 0));
+ cv::putText(u, strDevName, cv::Point(0, 64), 1, 0.8, cv::Scalar(0, 0, 0));
+
cv::directx::convertToD3D10Texture2D(u, pSurface);
break;
} // switch
- print_info(pSurface, m_mode, getFps(), m_oclDevName);
+ m_timer.stop();
// traditional DX render pipeline:
// BitBlt surface to backBuffer and flip backBuffer to frontBuffer
} // render()
- void print_info(ID3D10Texture2D* pSurface, int mode, float fps, cv::String oclDevName)
- {
- HRESULT r;
-
- UINT subResource = ::D3D10CalcSubresource(0, 0, 1);
-
- D3D10_MAPPED_TEXTURE2D mappedTex;
- r = pSurface->Map(subResource, D3D10_MAP_WRITE_DISCARD, 0, &mappedTex);
- if (FAILED(r))
- {
- return;
- }
-
- cv::Mat m(m_height, m_width, CV_8UC4, mappedTex.pData, (int)mappedTex.RowPitch);
-
- cv::String strMode = cv::format("%s", m_modeStr[mode].c_str());
- cv::String strProcessing = m_demo_processing ? "blur frame" : "copy frame";
- cv::String strFPS = cv::format("%2.1f", fps);
- cv::String strDevName = cv::format("%s", oclDevName.c_str());
-
- cv::putText(m, strMode, cv::Point(0, 16), 1, 0.8, cv::Scalar(0, 0, 0));
- cv::putText(m, strProcessing, cv::Point(0, 32), 1, 0.8, cv::Scalar(0, 0, 0));
- cv::putText(m, strFPS, cv::Point(0, 48), 1, 0.8, cv::Scalar(0, 0, 0));
- cv::putText(m, strDevName, cv::Point(0, 64), 1, 0.8, cv::Scalar(0, 0, 0));
-
- m_pSurface->Unmap(subResource);
-
- return;
- } // print_info()
-
-
int cleanup(void)
{
SAFE_RELEASE(m_pSurface);
m_pD3D11Ctx->RSSetViewports(1, &viewport);
- D3D11_TEXTURE2D_DESC desc = { 0 };
-
- desc.Width = m_width;
- desc.Height = m_height;
- desc.MipLevels = 1;
- desc.ArraySize = 1;
- desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- desc.SampleDesc.Count = 1;
- desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
- desc.Usage = D3D11_USAGE_DYNAMIC;
- desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ D3D11_TEXTURE2D_DESC desc;
+
+ desc.Width = m_width;
+ desc.Height = m_height;
+ desc.MipLevels = 1;
+ desc.ArraySize = 1;
+ desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ desc.SampleDesc.Count = 1;
+ desc.SampleDesc.Quality = 0;
+ desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
+ desc.Usage = D3D11_USAGE_DYNAMIC;
+ desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ desc.MiscFlags = 0;
r = m_pD3D11Dev->CreateTexture2D(&desc, NULL, &m_pSurface);
if (FAILED(r))
return 0;
HRESULT r;
- ID3D11Texture2D* pSurface;
+ ID3D11Texture2D* pSurface = 0;
r = get_surface(&pSurface);
if (FAILED(r))
throw std::runtime_error("get_surface() failed!");
}
+ m_timer.start();
+
switch (m_mode)
{
case MODE_CPU:
UINT subResource = ::D3D11CalcSubresource(0, 0, 1);
D3D11_MAPPED_SUBRESOURCE mappedTex;
- r = m_pD3D11Ctx->Map(m_pSurface, subResource, D3D11_MAP_WRITE_DISCARD, 0, &mappedTex);
+ r = m_pD3D11Ctx->Map(pSurface, subResource, D3D11_MAP_WRITE_DISCARD, 0, &mappedTex);
if (FAILED(r))
{
throw std::runtime_error("surface mapping failed!");
cv::blur(m, m, cv::Size(15, 15), cv::Point(-7, -7));
}
- m_pD3D11Ctx->Unmap(m_pSurface, subResource);
+ cv::String strMode = cv::format("%s", m_modeStr[MODE_CPU].c_str());
+ cv::String strProcessing = m_demo_processing ? "blur frame" : "copy frame";
+ cv::String strFPS = cv::format("%2.1f", m_timer.fps());
+ cv::String strDevName = cv::format("%s", m_oclDevName.c_str());
+
+ cv::putText(m, strMode, cv::Point(0, 16), 1, 0.8, cv::Scalar(0, 0, 0));
+ cv::putText(m, strProcessing, cv::Point(0, 32), 1, 0.8, cv::Scalar(0, 0, 0));
+ cv::putText(m, strFPS, cv::Point(0, 48), 1, 0.8, cv::Scalar(0, 0, 0));
+ cv::putText(m, strDevName, cv::Point(0, 64), 1, 0.8, cv::Scalar(0, 0, 0));
+
+ m_pD3D11Ctx->Unmap(pSurface, subResource);
break;
}
cv::blur(u, u, cv::Size(15, 15), cv::Point(-7, -7));
}
+ cv::String strMode = cv::format("%s", m_modeStr[MODE_GPU].c_str());
+ cv::String strProcessing = m_demo_processing ? "blur frame" : "copy frame";
+ cv::String strFPS = cv::format("%2.1f", m_timer.fps());
+ cv::String strDevName = cv::format("%s", m_oclDevName.c_str());
+
+ cv::putText(u, strMode, cv::Point(0, 16), 1, 0.8, cv::Scalar(0, 0, 0));
+ cv::putText(u, strProcessing, cv::Point(0, 32), 1, 0.8, cv::Scalar(0, 0, 0));
+ cv::putText(u, strFPS, cv::Point(0, 48), 1, 0.8, cv::Scalar(0, 0, 0));
+ cv::putText(u, strDevName, cv::Point(0, 64), 1, 0.8, cv::Scalar(0, 0, 0));
+
cv::directx::convertToD3D11Texture2D(u, pSurface);
break;
} // switch
- print_info(pSurface, m_mode, getFps(), m_oclDevName);
+ m_timer.stop();
// traditional DX render pipeline:
// BitBlt surface to backBuffer and flip backBuffer to frontBuffer
} // render()
- void print_info(ID3D11Texture2D* pSurface, int mode, float fps, cv::String oclDevName)
- {
- HRESULT r;
-
- UINT subResource = ::D3D11CalcSubresource(0, 0, 1);
-
- D3D11_MAPPED_SUBRESOURCE mappedTex;
- r = m_pD3D11Ctx->Map(pSurface, subResource, D3D11_MAP_WRITE_DISCARD, 0, &mappedTex);
- if (FAILED(r))
- {
- throw std::runtime_error("surface mapping failed!");
- }
-
- cv::Mat m(m_height, m_width, CV_8UC4, mappedTex.pData, (int)mappedTex.RowPitch);
-
- cv::String strMode = cv::format("%s", m_modeStr[mode].c_str());
- cv::String strProcessing = m_demo_processing ? "blur frame" : "copy frame";
- cv::String strFPS = cv::format("%2.1f", fps);
- cv::String strDevName = cv::format("%s", oclDevName.c_str());
-
- cv::putText(m, strMode, cv::Point(0, 16), 1, 0.8, cv::Scalar(0, 0, 0));
- cv::putText(m, strProcessing, cv::Point(0, 32), 1, 0.8, cv::Scalar(0, 0, 0));
- cv::putText(m, strFPS, cv::Point(0, 48), 1, 0.8, cv::Scalar(0, 0, 0));
- cv::putText(m, strDevName, cv::Point(0, 64), 1, 0.8, cv::Scalar(0, 0, 0));
-
- m_pD3D11Ctx->Unmap(pSurface, subResource);
-
- return;
- } // printf_info()
-
-
int cleanup(void)
{
SAFE_RELEASE(m_pSurface);
return -1;
}
+ m_timer.start();
+
switch (m_mode)
{
case MODE_CPU:
} // switch
- print_info(pSurface, m_mode, getFps(), m_oclDevName);
+ m_timer.stop();
+
+ print_info(pSurface, m_mode, m_timer.fps(), m_oclDevName);
// traditional DX render pipeline:
// BitBlt surface to backBuffer and flip backBuffer to frontBuffer
return -1;
}
+ m_timer.start();
+
switch (m_mode)
{
case MODE_CPU:
} // switch
- print_info(pSurface, m_mode, getFps(), m_oclDevName);
+ m_timer.stop();
+
+ print_info(pSurface, m_mode, m_timer.fps(), m_oclDevName);
// traditional DX render pipeline:
// BitBlt surface to backBuffer and flip backBuffer to frontBuffer
#define SAFE_RELEASE(p) if (p) { p->Release(); p = NULL; }
+class Timer
+{
+public:
+ Timer() : m_t0(0), m_t1(0)
+ {
+ m_tick_frequency = (float)cv::getTickFrequency();
+ }
+
+ void start()
+ {
+ m_t0 = cv::getTickCount();
+ time_queue.push(m_t0);
+ }
+
+ void stop()
+ {
+ if (time_queue.size() > 1)
+ m_t1 = time_queue.front();
+
+ if (time_queue.size() >= 25)
+ time_queue.pop();
+ }
+
+ float fps()
+ {
+ size_t sz = time_queue.size();
+
+ float fps = sz * m_tick_frequency / (m_t0 - m_t1);
+
+ return fps;
+ }
+
+public:
+ float m_tick_frequency;
+ int64 m_t0;
+ int64 m_t1;
+ std::queue<int64> time_queue;
+};
+
+
class D3DSample : public WinApp
{
public:
return WinApp::cleanup();
}
- static float getFps()
- {
- static std::queue<int64> time_queue;
-
- int64 now = cv::getTickCount();
- int64 then = 0;
- time_queue.push(now);
-
- if (time_queue.size() >= 2)
- then = time_queue.front();
-
- if (time_queue.size() >= 25)
- time_queue.pop();
-
- size_t sz = time_queue.size();
-
- float fps = sz * (float)cv::getTickFrequency() / (now - then);
-
- return fps;
- }
-
protected:
virtual LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
cv::VideoCapture m_cap;
cv::Mat m_frame_bgr;
cv::Mat m_frame_rgba;
+ Timer m_timer;
};