Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Unified Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 11568029: Add a command to lose the context (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add docs, lose parent and children, fix typo Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_mock.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index cb48d3bac8ec6ec308d47e67c76d48441e45a1d9..2f3366d261862e057851987caf90cf83d3f6c128 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -1445,8 +1445,8 @@ class GLES2DecoderImpl : public GLES2Decoder {
// the tracing system.
size_t GetBackbufferMemoryTotal();
- // Returns true if the context was just lost due to e.g. GL_ARB_robustness.
virtual bool WasContextLost() OVERRIDE;
+ virtual void LoseContext(uint32 reset_status) OVERRIDE;
#if defined(OS_MACOSX)
void ReleaseIOSurfaceForTexture(GLuint texture_id);
@@ -2137,7 +2137,7 @@ bool GLES2DecoderImpl::Initialize(
context_ = context;
surface_ = surface;
- if (!group_->Initialize(disallowed_features, allowed_extensions)) {
+ if (!group_->Initialize(this, disallowed_features, allowed_extensions)) {
LOG(ERROR) << "GpuScheduler::InitializeCommon failed because group "
<< "failed to initialize.";
group_ = NULL; // Must not destroy ContextGroup if it is not initialized.
@@ -3002,7 +3002,7 @@ void GLES2DecoderImpl::Destroy(bool have_context) {
}
if (group_) {
- group_->Destroy(have_context);
+ group_->Destroy(this, have_context);
group_ = NULL;
}
@@ -8801,6 +8801,9 @@ error::ContextLostReason GLES2DecoderImpl::GetContextLostReason() {
}
bool GLES2DecoderImpl::WasContextLost() {
+ if (reset_status_ != GL_NO_ERROR) {
+ return true;
+ }
if (context_->WasAllocatedUsingRobustnessExtension()) {
GLenum status = GL_NO_ERROR;
if (has_robustness_extension_)
@@ -8809,14 +8812,53 @@ bool GLES2DecoderImpl::WasContextLost() {
// The graphics card was reset. Signal a lost context to the application.
reset_status_ = status;
LOG(ERROR) << (surface_->IsOffscreen() ? "Offscreen" : "Onscreen")
- << " context lost via ARB/EXT_robustness. Reset status = 0x"
- << std::hex << status << std::dec;
+ << " context lost via ARB/EXT_robustness. Reset status = "
+ << GLES2Util::GetStringEnum(status);
return true;
}
}
return false;
}
+void GLES2DecoderImpl::LoseContext(uint32 reset_status) {
+ // Only loses the context once.
+ if (reset_status_ != GL_NO_ERROR) {
+ return;
+ }
+
+ // Marks this context as lost.
+ reset_status_ = reset_status;
+ current_decoder_error_ = error::kLostContext;
+
+ // Loses the parent's context.
+ if (parent_) {
+ parent_->LoseContext(reset_status);
+ }
+
+ // Loses any child contexts.
+ for (ChildList::iterator it = children_.begin();
+ it != children_.end();
+ ++it) {
+ (*it)->LoseContext(reset_status);
+ }
+}
+
+error::Error GLES2DecoderImpl::HandleLoseContextCHROMIUM(
+ uint32 immediate_data_size, const gles2::LoseContextCHROMIUM& c) {
+ GLenum current = static_cast<GLenum>(c.current);
+ GLenum other = static_cast<GLenum>(c.other);
+ if (!validators_->reset_status.IsValid(current)) {
+ SetGLErrorInvalidEnum("glLoseContextCHROMIUM", current, "current");
+ }
+ if (!validators_->reset_status.IsValid(other)) {
+ SetGLErrorInvalidEnum("glLoseContextCHROMIUM", other, "other");
+ }
+ group_->LoseContexts(other);
+ reset_status_ = current;
+ current_decoder_error_ = error::kLostContext;
+ return error::kLostContext;
+}
+
bool GLES2DecoderImpl::GenQueriesEXTHelper(
GLsizei n, const GLuint* client_ids) {
for (GLsizei ii = 0; ii < n; ++ii) {
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_mock.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698