const FramebufferAttachment *Framebuffer::getAttachment(GLenum attachment) const { if (attachment >= GL_COLOR_ATTACHMENT0 && attachment <= GL_COLOR_ATTACHMENT15) { return mState.getColorAttachment(attachment - GL_COLOR_ATTACHMENT0); } else { switch (attachment) { case GL_COLOR: case GL_BACK: return mState.getColorAttachment(0); case GL_DEPTH: case GL_DEPTH_ATTACHMENT: return mState.getDepthAttachment(); case GL_STENCIL: case GL_STENCIL_ATTACHMENT: return mState.getStencilAttachment(); case GL_DEPTH_STENCIL: case GL_DEPTH_STENCIL_ATTACHMENT: return getDepthStencilBuffer(); default: UNREACHABLE(); return nullptr; } } }
void Driver::decafClearDepthStencil(const latte::pm4::DecafClearDepthStencil &data) { flushPendingDraws(); // Find our depthbuffer to clear DepthStencilBufferDesc depthBuffer; depthBuffer.base256b = data.db_depth_base.BASE_256B(); depthBuffer.pitchTileMax = data.db_depth_size.PITCH_TILE_MAX(); depthBuffer.sliceTileMax = data.db_depth_size.SLICE_TILE_MAX(); depthBuffer.format = data.db_depth_info.FORMAT(); depthBuffer.arrayMode = data.db_depth_info.ARRAY_MODE(); depthBuffer.sliceStart = data.db_depth_view.SLICE_START(); depthBuffer.sliceEnd = data.db_depth_view.SLICE_MAX() + 1; auto surfaceView = getDepthStencilBuffer(depthBuffer); transitionSurfaceView(surfaceView, ResourceUsage::TransferDst, vk::ImageLayout::eTransferDstOptimal); auto db_depth_clear = getRegister<latte::DB_DEPTH_CLEAR>(latte::Register::DB_DEPTH_CLEAR); auto db_stencil_clear = getRegister<latte::DB_STENCIL_CLEAR>(latte::Register::DB_STENCIL_CLEAR); vk::ClearDepthStencilValue clearDepthStencil; clearDepthStencil.depth = db_depth_clear.DEPTH_CLEAR(); clearDepthStencil.stencil = db_stencil_clear.CLEAR(); mActiveCommandBuffer.clearDepthStencilImage( surfaceView->surface->image, vk::ImageLayout::eTransferDstOptimal, clearDepthStencil, { surfaceView->subresRange }); }
FramebufferAttachment *DefaultFramebuffer::getAttachment(GLenum attachment) const { switch (attachment) { case GL_COLOR: case GL_BACK: return getColorbuffer(0); case GL_DEPTH: return getDepthbuffer(); case GL_STENCIL: return getStencilbuffer(); case GL_DEPTH_STENCIL: return getDepthStencilBuffer(); default: UNREACHABLE(); return NULL; } }
FramebufferAttachment *Framebuffer::getAttachment(GLenum attachment) const { if (attachment >= GL_COLOR_ATTACHMENT0 && attachment <= GL_COLOR_ATTACHMENT15) { return getColorbuffer(attachment - GL_COLOR_ATTACHMENT0); } else { switch (attachment) { case GL_DEPTH_ATTACHMENT: return getDepthbuffer(); case GL_STENCIL_ATTACHMENT: return getStencilbuffer(); case GL_DEPTH_STENCIL_ATTACHMENT: return getDepthStencilBuffer(); default: UNREACHABLE(); return NULL; } } }