void CompositorD3D11::BeginFrame(const Rect* aClipRectIn, const gfxMatrix& aTransform, const Rect& aRenderBounds, Rect* aClipRectOut, Rect* aRenderBoundsOut) { // Don't composite if we are minimised. Other than for the sake of efficency, // this is important because resizing our buffers when mimised will fail and // cause a crash when we're restored. NS_ASSERTION(mHwnd, "Couldn't find an HWND when initialising?"); if (::IsIconic(mHwnd)) { *aRenderBoundsOut = Rect(); return; } UpdateRenderTarget(); // Failed to create a render target. if (!mDefaultRT || mSize.width == 0 || mSize.height == 0) { *aRenderBoundsOut = Rect(); return; } mContext->IASetInputLayout(mAttachments->mInputLayout); ID3D11Buffer* buffer = mAttachments->mVertexBuffer; UINT size = sizeof(Vertex); UINT offset = 0; mContext->IASetVertexBuffers(0, 1, &buffer, &size, &offset); if (aClipRectOut) { *aClipRectOut = Rect(0, 0, mSize.width, mSize.height); } if (aRenderBoundsOut) { *aRenderBoundsOut = Rect(0, 0, mSize.width, mSize.height); } D3D11_RECT scissor; if (aClipRectIn) { scissor.left = aClipRectIn->x; scissor.right = aClipRectIn->XMost(); scissor.top = aClipRectIn->y; scissor.bottom = aClipRectIn->YMost(); } else { scissor.left = scissor.top = 0; scissor.right = mSize.width; scissor.bottom = mSize.height; } mContext->RSSetScissorRects(1, &scissor); FLOAT black[] = { 0, 0, 0, 0 }; mContext->ClearRenderTargetView(mDefaultRT->mRTView, black); mContext->OMSetBlendState(mAttachments->mPremulBlendState, sBlendFactor, 0xFFFFFFFF); mContext->RSSetState(mAttachments->mRasterizerState); SetRenderTarget(mDefaultRT); }
void LayerManagerD3D10::SetupPipeline() { VerifyBufferSize(); UpdateRenderTarget(); nsIntRect rect; mWidget->GetClientBounds(rect); HRESULT hr; hr = mEffect->GetVariableByName("vTextureCoords")->AsVector()-> SetFloatVector(ShaderConstantRectD3D10(0, 0, 1.0f, 1.0f)); if (FAILED(hr)) { NS_WARNING("Failed to set Texture Coordinates."); return; } ID3D10RenderTargetView *view = mRTView; mDevice->OMSetRenderTargets(1, &view, NULL); mDevice->IASetInputLayout(mInputLayout); UINT stride = sizeof(Vertex); UINT offset = 0; ID3D10Buffer *buffer = mVertexBuffer; mDevice->IASetVertexBuffers(0, 1, &buffer, &stride, &offset); mDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); SetViewport(nsIntSize(rect.width, rect.height)); }
void CompositorD3D11::BeginFrame(const Rect* aClipRectIn, const gfxMatrix& aTransform, const Rect& aRenderBounds, Rect* aClipRectOut, Rect* aRenderBoundsOut) { UpdateRenderTarget(); // Failed to create a render target. if (!mDefaultRT || mSize.width == 0 || mSize.height == 0) { *aRenderBoundsOut = Rect(); return; } mContext->IASetInputLayout(mAttachments->mInputLayout); ID3D11Buffer* buffer = mAttachments->mVertexBuffer; UINT size = sizeof(Vertex); UINT offset = 0; mContext->IASetVertexBuffers(0, 1, &buffer, &size, &offset); if (aClipRectOut) { *aClipRectOut = Rect(0, 0, mSize.width, mSize.height); } if (aRenderBoundsOut) { *aRenderBoundsOut = Rect(0, 0, mSize.width, mSize.height); } D3D11_RECT scissor; if (aClipRectIn) { scissor.left = aClipRectIn->x; scissor.right = aClipRectIn->XMost(); scissor.top = aClipRectIn->y; scissor.bottom = aClipRectIn->YMost(); } else { scissor.left = scissor.top = 0; scissor.right = mSize.width; scissor.bottom = mSize.height; } mContext->RSSetScissorRects(1, &scissor); FLOAT black[] = { 0, 0, 0, 0 }; mContext->ClearRenderTargetView(mDefaultRT->mRTView, black); mContext->OMSetBlendState(mAttachments->mPremulBlendState, sBlendFactor, 0xFFFFFFFF); mContext->RSSetState(mAttachments->mRasterizerState); SetRenderTarget(mDefaultRT); }
void CompositorD3D11::BeginFrame(const nsIntRegion& aInvalidRegion, const Rect* aClipRectIn, const Rect& aRenderBounds, Rect* aClipRectOut, Rect* aRenderBoundsOut) { // Don't composite if we are minimised. Other than for the sake of efficency, // this is important because resizing our buffers when mimised will fail and // cause a crash when we're restored. NS_ASSERTION(mHwnd, "Couldn't find an HWND when initialising?"); if (::IsIconic(mHwnd) || gfxPlatform::GetPlatform()->DidRenderingDeviceReset()) { *aRenderBoundsOut = Rect(); return; } nsIntSize oldSize = mSize; UpdateRenderTarget(); // Failed to create a render target or the view. if (!mDefaultRT || !mDefaultRT->mRTView || mSize.width == 0 || mSize.height == 0) { *aRenderBoundsOut = Rect(); return; } mContext->IASetInputLayout(mAttachments->mInputLayout); ID3D11Buffer* buffer = mAttachments->mVertexBuffer; UINT size = sizeof(Vertex); UINT offset = 0; mContext->IASetVertexBuffers(0, 1, &buffer, &size, &offset); nsIntRect intRect = nsIntRect(nsIntPoint(0, 0), mSize); // Sometimes the invalid region is larger than we want to draw. nsIntRegion invalidRegionSafe; if (mSize != oldSize) { invalidRegionSafe = intRect; } else { invalidRegionSafe.And(aInvalidRegion, intRect); } nsIntRect invalidRect = invalidRegionSafe.GetBounds(); mInvalidRect = IntRect(invalidRect.x, invalidRect.y, invalidRect.width, invalidRect.height); mInvalidRegion = invalidRegionSafe; if (aClipRectOut) { *aClipRectOut = Rect(0, 0, mSize.width, mSize.height); } if (aRenderBoundsOut) { *aRenderBoundsOut = Rect(0, 0, mSize.width, mSize.height); } if (aClipRectIn) { invalidRect.IntersectRect(invalidRect, nsIntRect(aClipRectIn->x, aClipRectIn->y, aClipRectIn->width, aClipRectIn->height)); } mCurrentClip = IntRect(invalidRect.x, invalidRect.y, invalidRect.width, invalidRect.height); mContext->RSSetState(mAttachments->mRasterizerState); SetRenderTarget(mDefaultRT); // ClearRect will set the correct blend state for us. ClearRect(Rect(invalidRect.x, invalidRect.y, invalidRect.width, invalidRect.height)); if (mAttachments->mSyncTexture) { RefPtr<IDXGIKeyedMutex> mutex; mAttachments->mSyncTexture->QueryInterface((IDXGIKeyedMutex**)byRef(mutex)); MOZ_ASSERT(mutex); HRESULT hr = mutex->AcquireSync(0, 10000); if (hr == WAIT_TIMEOUT) { MOZ_CRASH(); } mutex->ReleaseSync(0); } }