Merge pull request #3714 from wwylele/primitive-restart-guard

video_core/command_processor: correctly handles 0xFFFF index as a normal index
This commit is contained in:
James Rowe 2018-05-29 23:22:00 -06:00 committed by GitHub
commit e63c374ff0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -351,12 +351,12 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
// Simple circular-replacement vertex cache // Simple circular-replacement vertex cache
// The size has been tuned for optimal balance between hit-rate and the cost of lookup // The size has been tuned for optimal balance between hit-rate and the cost of lookup
const size_t VERTEX_CACHE_SIZE = 32; const size_t VERTEX_CACHE_SIZE = 32;
std::array<bool, VERTEX_CACHE_SIZE> vertex_cache_valid{};
std::array<u16, VERTEX_CACHE_SIZE> vertex_cache_ids; std::array<u16, VERTEX_CACHE_SIZE> vertex_cache_ids;
std::array<Shader::AttributeBuffer, VERTEX_CACHE_SIZE> vertex_cache; std::array<Shader::AttributeBuffer, VERTEX_CACHE_SIZE> vertex_cache;
Shader::AttributeBuffer vs_output; Shader::AttributeBuffer vs_output;
unsigned int vertex_cache_pos = 0; unsigned int vertex_cache_pos = 0;
vertex_cache_ids.fill(-1);
auto* shader_engine = Shader::GetEngine(); auto* shader_engine = Shader::GetEngine();
Shader::UnitState shader_unit; Shader::UnitState shader_unit;
@ -374,10 +374,6 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
is_indexed ? (index_u16 ? index_address_16[index] : index_address_8[index]) is_indexed ? (index_u16 ? index_address_16[index] : index_address_8[index])
: (index + regs.pipeline.vertex_offset); : (index + regs.pipeline.vertex_offset);
// -1 is a common special value used for primitive restart. Since it's unknown if
// the PICA supports it, and it would mess up the caching, guard against it here.
ASSERT(vertex != -1);
bool vertex_cache_hit = false; bool vertex_cache_hit = false;
if (is_indexed) { if (is_indexed) {
@ -393,7 +389,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
} }
for (unsigned int i = 0; i < VERTEX_CACHE_SIZE; ++i) { for (unsigned int i = 0; i < VERTEX_CACHE_SIZE; ++i) {
if (vertex == vertex_cache_ids[i]) { if (vertex_cache_valid[i] && vertex == vertex_cache_ids[i]) {
vs_output = vertex_cache[i]; vs_output = vertex_cache[i];
vertex_cache_hit = true; vertex_cache_hit = true;
break; break;
@ -416,6 +412,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
if (is_indexed) { if (is_indexed) {
vertex_cache[vertex_cache_pos] = vs_output; vertex_cache[vertex_cache_pos] = vs_output;
vertex_cache_valid[vertex_cache_pos] = true;
vertex_cache_ids[vertex_cache_pos] = vertex; vertex_cache_ids[vertex_cache_pos] = vertex;
vertex_cache_pos = (vertex_cache_pos + 1) % VERTEX_CACHE_SIZE; vertex_cache_pos = (vertex_cache_pos + 1) % VERTEX_CACHE_SIZE;
} }