DriWrapper* drm,
scoped_ptr<CrtcState> state)
: drm_(drm),
+ is_disabled_(true),
time_of_last_flip_(0),
pending_page_flips_(0) {
crtc_states_.push_back(state.release());
bool HardwareDisplayController::Modeset(const OverlayPlane& primary,
drmModeModeInfo mode) {
TRACE_EVENT0("dri", "HDC::Modeset");
- DCHECK(primary.buffer);
+ DCHECK(primary.buffer.get());
pending_page_flips_ = 0;
bool status = true;
- for (size_t i = 0; i < crtc_states_.size(); ++i)
+ for (size_t i = 0; i < crtc_states_.size(); ++i) {
status &= ModesetCrtc(primary.buffer, mode, crtc_states_[i]);
+ crtc_states_[i]->set_is_disabled(false);
+ }
// Since a subset of controllers may be actively using |primary|, just keep
// track of it.
current_planes_ = std::vector<OverlayPlane>(1, primary);
pending_planes_.clear();
+ is_disabled_ = false;
mode_ = mode;
return status;
}
TRACE_EVENT0("dri", "HDC::Enable");
DCHECK(!current_planes_.empty());
OverlayPlane primary = GetPrimaryPlane(current_planes_);
- DCHECK(primary.buffer);
+ DCHECK(primary.buffer.get());
pending_page_flips_ = 0;
bool status = true;
for (size_t i = 0; i < crtc_states_.size(); ++i)
drm_->DisableCrtc(crtc_states_[i]->crtc());
crtc_states_[i]->set_is_disabled(true);
}
+
+ is_disabled_ = true;
}
void HardwareDisplayController::QueueOverlayPlane(const OverlayPlane& plane) {
DCHECK(!pending_planes_.empty());
DCHECK_EQ(0u, pending_page_flips_);
- bool status = true;
- for (size_t i = 0; i < crtc_states_.size(); ++i) {
- if (crtc_states_[i]->is_disabled())
- continue;
+ if (is_disabled_)
+ return true;
+ bool status = true;
+ for (size_t i = 0; i < crtc_states_.size(); ++i)
status &= SchedulePageFlipOnCrtc(pending_planes_, crtc_states_[i]);
- }
return status;
}
bool HardwareDisplayController::SetCursor(scoped_refptr<ScanoutBuffer> buffer) {
bool status = true;
cursor_buffer_ = buffer;
+
+ if (is_disabled_)
+ return true;
+
for (size_t i = 0; i < crtc_states_.size(); ++i) {
- if (!crtc_states_[i]->is_disabled())
- status &= drm_->SetCursor(crtc_states_[i]->crtc(),
- buffer->GetHandle(),
- buffer->GetSize());
+ status &= drm_->SetCursor(
+ crtc_states_[i]->crtc(), buffer->GetHandle(), buffer->GetSize());
}
return status;
}
bool HardwareDisplayController::MoveCursor(const gfx::Point& location) {
+ if (is_disabled_)
+ return true;
+
bool status = true;
for (size_t i = 0; i < crtc_states_.size(); ++i)
- if (!crtc_states_[i]->is_disabled())
- status &= drm_->MoveCursor(crtc_states_[i]->crtc(), location);
+ status &= drm_->MoveCursor(crtc_states_[i]->crtc(), location);
return status;
}
return false;
}
-bool HardwareDisplayController::HasCrtcs() const {
- return !crtc_states_.empty();
+bool HardwareDisplayController::IsMirrored() const {
+ return crtc_states_.size() > 1;
+}
+
+bool HardwareDisplayController::IsDisabled() const {
+ return is_disabled_;
}
-void HardwareDisplayController::RemoveMirroredCrtcs() {
- if (crtc_states_.size() > 1)
- crtc_states_.erase(crtc_states_.begin() + 1, crtc_states_.end());
+gfx::Size HardwareDisplayController::GetModeSize() const {
+ return gfx::Size(mode_.hdisplay, mode_.vdisplay);
}
bool HardwareDisplayController::ModesetCrtc(
return false;
}
- state->set_is_disabled(false);
return true;
}
const OverlayPlaneList& overlays,
CrtcState* state) {
const OverlayPlane& primary = GetPrimaryPlane(overlays);
- DCHECK(primary.buffer);
+ DCHECK(primary.buffer.get());
if (primary.buffer->GetSize() != gfx::Size(mode_.hdisplay, mode_.vdisplay)) {
LOG(WARNING) << "Trying to pageflip a buffer with the wrong size. Expected "