Масштабирование изображения, сохраненного в D3D11 MAPPED SUBRESOURCE pResourceC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Масштабирование изображения, сохраненного в D3D11 MAPPED SUBRESOURCE pResource

Сообщение Anonymous »

Я использую DuplicationOutput для захвата экрана. AcquireNextFrame предоставляет мне захваченное изображение.
В конце я сопоставляю его с помощью:

Код: Выделить всё

hr = mComPtrlImmediateContext->Map(mComPtrlDestImage, subresource,
D3D11_MAP_READ_WRITE, 0, &moResource);//moResource is D3D11_MAPPED_SUBRESOURCE type.
Теперь я хочу масштабировать изображение. Я не хочу использовать шейдеры (слишком сложные), поэтому я использую DXVAHD (VideoProcessBltHD) для масштабирования его в графическом процессоре, поскольку moResource встроен в графический процессор.
Проблема в том, что moResource — это D3D11, а DXVAHD использует IDirect3DSurface9.
Итак, чтобы загрузить D3D11_MAPPED_SUBRESOURCE в DXVAHD IDirect3DSurface9 Я использую это:

Код: Выделить всё

HRESULT DXVAHDImageResizer::LoadResourceToSurface(D3D11_MAPPED_SUBRESOURCE* pResource)
{
HRESULT hr = S_OK;
D3DLOCKED_RECT lr = { 0 };
bool bNeedToUnlock = false;;
try
{
hr = mpSurface->LockRect(&lr, NULL, D3DLOCK_NOSYSLOCK);
if (FAILED(hr)) { goto done; }
bNeedToUnlock = true;
UINT iDestRowPitch = lr.Pitch;
UINT iSourceRowPitch = pResource->RowPitch;

BYTE* sptr = reinterpret_cast(pResource->pData);
BYTE* dptr = (byte*)lr.pBits;
int iPitchToCopy = min(iDestRowPitch, iSourceRowPitch);
for (int h = 0; h < moInputVideoInfoHeader.bmiHeader.biHeight; ++h)
{
memcpy(dptr, sptr, iPitchToCopy);
dptr += iDestRowPitch;
sptr += iSourceRowPitch;
}
}
catch (...) { DEBUG_BREAK_MY }
done:
if (bNeedToUnlock) mpSurface->UnlockRect();

return hr;
}
Но, как вы можете видеть, для копирования это передается процессору.
  • Есть ли способ загрузить D3D11_MAPPED_SUBRESOURCE в IDirect3DSurface9 без использования процессора?
  • Или у вас есть другой способ масштабировать изображение, хранящееся в D3D11_MAPPED_SUBRESOURCE, с помощью графического процессора без использования шейдеры?
Кто-то спросил в комментариях, почему я вообще сопоставляю это с процессором. Единственная причина в том, что это единственный найденный мною способ передать DXVAHD захваченные данные.

7.12.24 Обновление для вопроса @Simon Mourier
Вот что у меня есть:

Код: Выделить всё

CComPtrCustom mComPtrlGDIImage;
desc.Width = SourceWidth;
desc.Height = SourceHeight;
desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
desc.ArraySize = 1;
desc.BindFlags = D3D11_BIND_FLAG::D3D11_BIND_RENDER_TARGET;
desc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.MipLevels = 1;
desc.CPUAccessFlags = 0;
desc.Usage = D3D11_USAGE_DEFAULT;
hr = mlDevice->CreateTexture2D(&desc, NULL, &mComPtrlGDIImage);

hr = mComPtrlDeskDupl->AcquireNextFrame(0, &lFrameInfo, &lDesktopResource);
hr = lDesktopResource->QueryInterface(IID_PPV_ARGS(&lAcquiredDesktopImage));
mComPtrlImmediateContext->CopySubresourceRegion(mComPtrlGDIImage,
0, 0, 0, 0, lAcquiredDesktopImage, 0, &box);
Теперь mComPtrlGDIImage содержит изображение графического процессора.
Теперь я хочу масштабировать его, скажем, до 1080P. Как это сделать?

Подробнее здесь: https://stackoverflow.com/questions/792 ... -presource
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»