IDXGISurface :: Map: этот объект не был создан с флагами CPUAccess, которые разрешают доступ к процессору - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь создать новый ID3D11Texture2D для сопоставления его с DXGI_MAPPED_RECT в дальнейшем. Я получаю ID3D11Texture2D, что у меня нет питания (не может изменить способ создания).

Вот часть кода:

CComPtr<IDXGIResource> cpDXGIResource;
RET_HR_NULL(_pTexIn->QueryInterface(__uuidof(IDXGIResource), (void**)&cpDXGIResource), cpDXGIResource);

HANDLE sharedHandle;
cpDXGIResource->GetSharedHandle(&sharedHandle);

CComPtr<ID3D11Texture2D> cpTexIn;
cpD3D11Device->OpenSharedResource(sharedHandle, __uuidof(ID3D11Resource), (void**)(&cpTexIn));

D3D11_TEXTURE2D_DESC td;
cpTexIn->GetDesc(&td);
td.Usage = D3D11_USAGE_STAGING;
td.BindFlags = D3D11_BIND_SHADER_RESOURCE;
td.CPUAccessFlags = D3D11_CPU_ACCESS_READ;

CComPtr<ID3D11Texture2D> cpNewTexture;
RET_HR_NULL(cpD3D11Device->CreateTexture2D(&td, NULL, &cpNewTexture), cpNewTexture);

cpD3D11DeviceContext->CopyResource(cpNewTexture, cpTexIn);

CComPtr<IDXGISurface> cpDXGISurface;
RET_HR_NULL(cpNewTexture->QueryInterface(&cpDXGISurface), cpDXGISurface);

D3D11_TEXTURE2D_DESC ntd;
cpNewTexture->GetDesc(&ntd);

DXGI_SURFACE_DESC sd;
cpDXGISurface->GetDesc(&sd);

DXGI_MAPPED_RECT bitmap2Dmap;
RET_HR(cpDXGISurface->Map(&bitmap2Dmap, DXGI_MAP_READ));

_pTexIn является вход ID3D11Texture2D. Я получаю сообщение об ошибке ниже, пока Map():

RET_HR(cpDXGISurface->Map(&bitmap2Dmap, DXGI_MAP_READ));

DXGI ERROR: IDXGISurface :: Map: Этот объект не был создан с флагами CPUAccess, которые разрешают доступ к ЦП. [РАЗНАЯ ОШИБКА # 42:] Исключение, выданное в 0x76734192 в testhost.x86.exe: исключение Microsoft C ++: _com_error в расположении памяти 0x0716E134. Нить 0x26bc вышла с кодом 0 (0x0).

НО! , на самом деле у меня D3D11_CPU_ACCESS_READ установлено на cpNewTexture. Смотрите вывод ntd и sd ниже:

Вот содержимое ntd и sd:

ntd {Width=0x00000354 Height=0x000001e0 MipLevels=0x00000001 ...}   D3D11_TEXTURE2D_DESC
    Width   0x00000354  unsigned int
    Height  0x000001e0  unsigned int
    MipLevels   0x00000001  unsigned int
    ArraySize   0x00000001  unsigned int
    Format  DXGI_FORMAT_B8G8R8A8_UNORM (0x00000057) DXGI_FORMAT
    SampleDesc  {Count=0x00000001 Quality=0x00000000 }  DXGI_SAMPLE_DESC
    Usage   D3D11_USAGE_DEFAULT (0x00000000)    D3D11_USAGE
    BindFlags   0x00000008  unsigned int
    CPUAccessFlags  0x00020000  unsigned int
    MiscFlags   0x00000002  unsigned int


sd  {Width=0x00000354 Height=0x000001e0 Format=DXGI_FORMAT_B8G8R8A8_UNORM (0x00000057) ...} DXGI_SURFACE_DESC
    Width   0x00000354  unsigned int
    Height  0x000001e0  unsigned int
    Format  DXGI_FORMAT_B8G8R8A8_UNORM (0x00000057) DXGI_FORMAT
    SampleDesc  {Count=0x00000001 Quality=0x00000000 }  DXGI_SAMPLE_DESC

1 Ответ

0 голосов
/ 16 марта 2020

ОК, в основном вопрос Рома дал следующее объяснение:

ОК, я, кажется, теперь понимаю ... Я думал, что вы отображение выходной текстуры (для чтения!), но вы отображаете входную текстуру. Почему? В мою защиту поток выполнения трудно читать из фрагментов. Я также запутался, почему вы вообще используете IDXGISurface::Map()? Вам, кажется, не нужно это. Возможно, вам следует объяснить себе, чего вы пытаетесь достичь. У вас уже есть текстура, которую вы используете в качестве входных данных. Это совместимо с D2D? Если да, просто используйте это сначала дальше. В этом нет, создать совместимую и скопировать туда текстуру ввода. Вам не нужна Карта ни для одной из двух.

Даже если вам нужна Карта, почему IDXGISurface::Map()? У вас есть ID3D11DeviceContext::Map(), который подходит для доступа к данным текстуры с текстурами, которые предполагают это. Я бы сказал, что вы вообще не должны делать IDXGISurface::Map(). Затем, если Map() для чтения вывода предназначен для завершения рисования, тогда вы либо сопоставляете текстуру, либо копируете ее в mappable и отображаете эту вторую.

В конце концов

Вам все равно не нужно Map(). Хотя это возможно, этот путь с Map() и CreateBitmap() является очевидным ударом по производительности. Вместо этого вы можете и должны использовать другой API. Используя CreateSharedBitmap для создания ID2D1Bitmap из IDXGISurface, вы можете записать сцену Direct3D в растровое изображение и отобразить ее с помощью Direct2D .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...