When I'm playing with this MSDN sample, I just fail to add a blur effect on an ID2D1Image created by DXGISurface and filled with some rectangles.
Here is my EndDraw method:
void Scenario1ImageSource::EndDraw()
{
// Remove the transform and clip applied in BeginDraw since
// the target area can change on every update.
m_d2dContext->SetTransform(D2D1::IdentityMatrix());
m_d2dContext->PopAxisAlignedClip();
DX::ThrowIfFailed(
m_d2dContext->Flush()
);
ComPtr<ID2D1Image> bitmap;
m_d2dContext->GetTarget(&bitmap);
DX::ThrowIfFailed(
m_d2dContext->CreateEffect(CLSID_D2D1GaussianBlur, &m_gaussianBlurEffect)
);
m_gaussianBlurEffect->SetInput(0, bitmap.Get());
DX::ThrowIfFailed(
m_gaussianBlurEffect->SetValue(D2D1_GAUSSIANBLUR_PROP_STANDARD_DEVIATION, 3.0f)
);
DX::ThrowIfFailed(
m_gaussianBlurEffect->SetValue(D2D1_GAUSSIANBLUR_PROP_BORDER_MODE, D2D1_BORDER_MODE_HARD)
);
m_d2dContext->BeginDraw();
m_d2dContext->DrawImage(m_gaussianBlurEffect.Get());
// Remove the render target and end drawing.
DX::ThrowIfFailed(
m_d2dContext->EndDraw()
);
m_d2dContext->SetTarget(nullptr);
// Query for ISurfaceImageSourceNative interface.
Microsoft::WRL::ComPtr<ISurfaceImageSourceNative> sisNative;
DX::ThrowIfFailed(
reinterpret_cast<IUnknown*>(this)->QueryInterface(IID_PPV_ARGS(&sisNative))
);
DX::ThrowIfFailed(
sisNative->EndDraw()
);
}
I want to blur my rectangles after they draw on the image. Why it failed by throwing exception with error code D2DERR_INVALID_GRAPH_CONFIGURATION?
Your problem is caused because you are trying to apply an effect to a resource (bitmap/surface in your case) in a
BeginDraw/EndDrawblock when this resource is used by theDeviceContextas a target. Roughly said, when you callID2D1RenderTarget.BeginDraw, its target becomes locked and you can't use it for something else than aTARGET.A simple solution is the use of intermediate bitmap as an offscreen one. Eg (pseudocode):
Keep in mind that the output bitmap from the built in GaussianBlur effect can be larger than the input one. Gaussian blur effect