blob: 666468754c32f4fc0aed64236e04e7da5c760fed [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GPU_FEATURES_H_
#define GPU_FEATURES_H_
#include "registers.h"
#include <vector>
class GpuFeatures {
public:
GpuFeatures(magma::RegisterIo* io)
{
revision_ = registers::Revision::Get().ReadFrom(io);
features_ = registers::Features::Get().ReadFrom(io);
minor_features_.resize(6);
minor_features_[0] = registers::MinorFeatures::Get(0).ReadFrom(io);
if (minor_features_[0].reg_value() & registers::MinorFeatures::kMoreMinorFeatures) {
for (uint32_t i = 1; i < minor_features_.size(); i++) {
minor_features_[i] = registers::MinorFeatures::Get(i).ReadFrom(io);
}
}
specs1_ = registers::Specs1::Get().ReadFrom(io);
specs2_ = registers::Specs2::Get().ReadFrom(io);
specs3_ = registers::Specs3::Get().ReadFrom(io);
specs4_ = registers::Specs4::Get().ReadFrom(io);
}
uint32_t revision() { return revision_.reg_value(); }
registers::Features& features() { return features_; }
uint32_t minor_features(uint32_t index) { return minor_features_[index].reg_value(); }
bool halti5() { return minor_features_[5].reg_value() & registers::MinorFeatures::kHalti5; }
bool has_mmu() { return minor_features_[1].reg_value() & registers::MinorFeatures::kHasMmu; }
uint32_t register_max() { return 1u << specs1_.log2_register_max().get(); }
uint32_t thread_count() { return 1u << specs1_.log2_thread_count().get(); }
uint32_t vertex_output_buffer_size()
{
return 1u << specs1_.log2_vertex_output_buffer_size().get();
}
uint32_t vertex_cache_size() { return specs1_.vertex_cache_size().get(); }
uint32_t shader_core_count() { return specs1_.shader_core_count().get(); }
uint32_t pixel_pipes() { return specs1_.pixel_pipes().get(); }
uint32_t stream_count() { return specs4_.stream_count().get(); }
uint32_t buffer_size() { return specs2_.buffer_size().get(); }
uint32_t num_constants() { return specs2_.num_constants().get(); }
uint32_t varyings_count() { return specs3_.varyings_count().get(); }
uint32_t instruction_count()
{
DASSERT(specs2_.instruction_count().get() == 0);
return 256;
}
private:
registers::Revision revision_;
registers::Features features_;
std::vector<registers::MinorFeatures> minor_features_;
registers::Specs1 specs1_;
registers::Specs2 specs2_;
registers::Specs3 specs3_;
registers::Specs4 specs4_;
};
#endif // GPU_FEATURES_H_