1
\$\begingroup\$

I'm trying to create ID2D1RenderTarget to be used for writing text with DirectWrite. I tried two methods but can't get it working, both yield "The parameter is incorrect" error code.

In the first one I created Texture2D with CreateTexture2D and got IDXGISurface with ID3D11Texture2D_QueryInterface. In the second one i got surface directly from back buffer with IDXGISwapChain2_GetBuffer but that doesn't work either.

I think the problem is in the surface but i just don't understand this stuff deeply enough to debug it correctly. Here is my code for the second method:

Getting the surface (i tried with IDXGISurface2 too):

IDXGISurface * BackBuffer = 0;

HR = IDXGISwapChain2_GetBuffer(Renderer.SwapChain2,
                               0,
                               &IID_IDXGISurface,
                               (void**)&BackBuffer);


AssertHR(HR && BackBuffer);

D2DMake(BackBuffer ,&Renderer.DWriteRenderTarget);

And the code for creating RenderTarget:

extern "C" void
D2DMake(IDXGISurface * DxgiSurface,
        ID2D1RenderTarget ** DWriteRenderTarget)
{
    ID2D1Factory2 * D2DFactory2 = 0;
    
    HRESULT HR = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED ,&D2DFactory2);
    AssertHR(HR);
    
    D2D1_RENDER_TARGET_PROPERTIES Props =
        D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT,
                                     D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED),
                                     0,
                                     0);
    
    
    Assert(DxgiSurface && D2DFactory2);
    
    HR = D2DFactory2->CreateDxgiSurfaceRenderTarget(DxgiSurface,
                                                    Props,
                                                    DWriteRenderTarget);
    
    AssertHR(HR);  // Here is where it fails
    ...

And the way i create SwapAndChain

DXGI_SWAP_CHAIN_DESC1 SwapChainDesc =
        {
            .Format      = DXGI_FORMAT_B8G8R8A8_UNORM,
            .SampleDesc  = {1, 0},
            .BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT,
            .BufferCount = 2,
            .SwapEffect  = DXGI_SWAP_EFFECT_FLIP_DISCARD,
            .Scaling     = DXGI_SCALING_NONE,
            .AlphaMode   = DXGI_ALPHA_MODE_IGNORE,
            .Flags       = 0, 
        };
        
        IDXGISwapChain1 *SwapChain1 = 0;
        HR = IDXGIFactory2_CreateSwapChainForHwnd(DxgiFactory2,
                                                  (IUnknown*)Renderer.Device2, 
                                                  Window,
                                                  &SwapChainDesc,
                                                  0,
                                                  0,
                                                  &SwapChain1);
        
        AssertHR(HR);
        
        HR = IDXGISwapChain2_QueryInterface(SwapChain1,
                                            &IID_IDXGISwapChain2,
                                            (void **)&Renderer.SwapChain2);
        
        AssertHR(HR);
\$\endgroup\$

1 Answer 1

2
\$\begingroup\$

I got to the bottom of this by enabling debug layer, both on d3d11 side and d2d side. Creating ID2D1Factory with debug options set on D2D1_DEBUG_LEVEL_INFORMATION revealed that I didn't enable D3D11_CREATE_DEVICE_BGRA_SUPPORT flag when creating ID3D11Device.

\$\endgroup\$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .