/* returns pointer to the key at the given slot of the given node */ PUBLIC struct key *key_for(struct cache *node, int slot) { assert(slot < node->u.node.header.nritems); if (INDEX_TYPE(node->u.node.header.type)) { return &node->u.node.u.key_ptrs[slot].key; } else if (LEAF_TYPE(node->u.node.header.type)) { return &node->u.node.u.items[slot].key; } else { assert(FALSE); } }
void GLDriver::drawIndex2(const pm4::DrawIndex2 &data) { if (!checkReadyDraw()) { return; } auto vgt_primitive_type = getRegister<latte::VGT_PRIMITIVE_TYPE>(latte::Register::VGT_PRIMITIVE_TYPE); auto sq_vtx_base_vtx_loc = getRegister<latte::SQ_VTX_BASE_VTX_LOC>(latte::Register::SQ_VTX_BASE_VTX_LOC); auto vgt_dma_index_type = getRegister<latte::VGT_DMA_INDEX_TYPE>(latte::Register::VGT_DMA_INDEX_TYPE); auto vgt_dma_num_instances = getRegister<latte::VGT_DMA_NUM_INSTANCES>(latte::Register::VGT_DMA_NUM_INSTANCES); auto vgt_strmout_en = getRegister<latte::VGT_STRMOUT_EN>(latte::Register::VGT_STRMOUT_EN); // Swap and indexBytes are separate because you can have 32-bit swap, // but 16-bit indices in some cases... This is also why we pre-swap // the data before intercepting QUAD and POLYGON draws. if (vgt_dma_index_type.SWAP_MODE() == latte::VGT_DMA_SWAP_16_BIT) { auto *src = static_cast<uint16_t*>(data.addr.get()); auto indices = std::vector<uint16_t>(data.count); if (vgt_dma_index_type.INDEX_TYPE() != latte::VGT_INDEX_16) { decaf_abort(fmt::format("Unexpected INDEX_TYPE {} for VGT_DMA_SWAP_16_BIT", vgt_dma_index_type.INDEX_TYPE())); } for (auto i = 0u; i < data.count; ++i) { indices[i] = byte_swap(src[i]); } drawPrimitives(data.count, indices.data(), vgt_dma_index_type.INDEX_TYPE()); } else if (vgt_dma_index_type.SWAP_MODE() == latte::VGT_DMA_SWAP_32_BIT) { auto *src = static_cast<uint32_t*>(data.addr.get()); auto indices = std::vector<uint32_t>(data.count); if (vgt_dma_index_type.INDEX_TYPE() != latte::VGT_INDEX_32) { decaf_abort(fmt::format("Unexpected INDEX_TYPE {} for VGT_DMA_SWAP_32_BIT", vgt_dma_index_type.INDEX_TYPE())); } for (auto i = 0u; i < data.count; ++i) { indices[i] = byte_swap(src[i]); } drawPrimitives(data.count, indices.data(), vgt_dma_index_type.INDEX_TYPE()); } else if (vgt_dma_index_type.SWAP_MODE() == latte::VGT_DMA_SWAP_NONE) { drawPrimitives(data.count, data.addr, vgt_dma_index_type.INDEX_TYPE()); } else { decaf_abort(fmt::format("Unimplemented vgt_dma_index_type.SWAP_MODE {}", vgt_dma_index_type.SWAP_MODE())); } }
PRIVATE blocknr_t ptr_for(struct cache *node, int slot) { assert(slot < node->u.node.header.nritems); assert(INDEX_TYPE(node->u.node.header.type)); return node->u.node.u.key_ptrs[slot].blocknr; }