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

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

Issue 2837213003: Restore samplers' state across virtualized GL contexts. (Closed)
Patch Set: Add unit tests covering restoration of sampler state. Created 3 years, 8 months 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_unittest_base.cc ('k') | ui/gl/gl_state_restorer.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_unittest_context_state.cc
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc
index 97136e1fc7fc2d15cd2dd411bec3122b64e758c4..4a51f3ed392ba890152b5e0fcf6a4651b7b3b2d4 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc
@@ -77,6 +77,10 @@ class GLES2DecoderRestoreStateTest : public GLES2DecoderManualInitTest {
void InitializeContextState(ContextState* state,
uint32_t non_default_unit,
uint32_t active_unit);
+
+ // ES3 specific.
+ scoped_refptr<FeatureInfo> SetupForES3Test();
+ void AddExpectationsForBindSampler(GLuint unit, GLuint id);
};
INSTANTIATE_TEST_CASE_P(Service,
@@ -109,6 +113,30 @@ void GLES2DecoderRestoreStateTest::InitializeContextState(
state->texture_units[tt].bound_texture_2d = ref_2d;
}
state->active_texture_unit = active_unit;
+
+ // Set up the sampler units just for convenience of the ES3-specific
+ // tests in this file.
+ state->sampler_units.resize(group().max_texture_units());
+}
+
+scoped_refptr<FeatureInfo> GLES2DecoderRestoreStateTest::SetupForES3Test() {
+ InitState init;
+ init.gl_version = "OpenGL ES 3.0";
+ init.context_type = CONTEXT_TYPE_OPENGLES3;
+ InitDecoder(init);
+
+ // Construct a previous ContextState assuming an ES3 context and with all
+ // texture bindings set to default textures.
+ scoped_refptr<FeatureInfo> feature_info = new FeatureInfo;
+ TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
+ gl_.get(), "", "", "OpenGL ES 3.0", CONTEXT_TYPE_OPENGLES3);
+ feature_info->InitializeForTesting(CONTEXT_TYPE_OPENGLES3);
+ return feature_info;
+}
+
+void GLES2DecoderRestoreStateTest::AddExpectationsForBindSampler(GLuint unit,
+ GLuint id) {
+ EXPECT_CALL(*gl_, BindSampler(unit, id)).Times(1).RetiresOnSaturation();
}
TEST_P(GLES2DecoderRestoreStateTest, NullPreviousStateBGR) {
@@ -136,7 +164,7 @@ TEST_P(GLES2DecoderRestoreStateTest, NullPreviousStateBGR) {
// Expect to restore the active texture unit to GL_TEXTURE0.
AddExpectationsForActiveTexture(GL_TEXTURE0);
- GetDecoder()->RestoreAllTextureUnitBindings(NULL);
+ GetDecoder()->RestoreAllTextureUnitAndSamplerBindings(NULL);
}
TEST_P(GLES2DecoderRestoreStateTest, NullPreviousState) {
@@ -160,7 +188,7 @@ TEST_P(GLES2DecoderRestoreStateTest, NullPreviousState) {
// Expect to restore the active texture unit to GL_TEXTURE0.
AddExpectationsForActiveTexture(GL_TEXTURE0);
- GetDecoder()->RestoreAllTextureUnitBindings(NULL);
+ GetDecoder()->RestoreAllTextureUnitAndSamplerBindings(NULL);
}
TEST_P(GLES2DecoderRestoreStateTest, WithPreviousStateBGR) {
@@ -184,7 +212,7 @@ TEST_P(GLES2DecoderRestoreStateTest, WithPreviousStateBGR) {
// Expect to restore active texture unit to GL_TEXTURE0.
AddExpectationsForActiveTexture(GL_TEXTURE0);
- GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
+ GetDecoder()->RestoreAllTextureUnitAndSamplerBindings(&prev_state);
}
TEST_P(GLES2DecoderRestoreStateTest, WithPreviousState) {
@@ -207,7 +235,7 @@ TEST_P(GLES2DecoderRestoreStateTest, WithPreviousState) {
// Expect to restore active texture unit to GL_TEXTURE0.
AddExpectationsForActiveTexture(GL_TEXTURE0);
- GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
+ GetDecoder()->RestoreAllTextureUnitAndSamplerBindings(&prev_state);
}
TEST_P(GLES2DecoderRestoreStateTest, ActiveUnit1) {
@@ -237,7 +265,7 @@ TEST_P(GLES2DecoderRestoreStateTest, ActiveUnit1) {
// Expect to restore active texture unit to GL_TEXTURE1.
AddExpectationsForActiveTexture(GL_TEXTURE1);
- GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
+ GetDecoder()->RestoreAllTextureUnitAndSamplerBindings(&prev_state);
}
TEST_P(GLES2DecoderRestoreStateTest, NonDefaultUnit0BGR) {
@@ -275,7 +303,7 @@ TEST_P(GLES2DecoderRestoreStateTest, NonDefaultUnit0BGR) {
// Expect to restore active texture unit to GL_TEXTURE1.
AddExpectationsForActiveTexture(GL_TEXTURE1);
- GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
+ GetDecoder()->RestoreAllTextureUnitAndSamplerBindings(&prev_state);
}
TEST_P(GLES2DecoderRestoreStateTest, NonDefaultUnit1BGR) {
@@ -307,7 +335,7 @@ TEST_P(GLES2DecoderRestoreStateTest, NonDefaultUnit1BGR) {
// Expect to restore active texture unit to GL_TEXTURE0.
AddExpectationsForActiveTexture(GL_TEXTURE0);
- GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
+ GetDecoder()->RestoreAllTextureUnitAndSamplerBindings(&prev_state);
}
TEST_P(GLES2DecoderRestoreStateTest, DefaultUnit0) {
@@ -343,7 +371,7 @@ TEST_P(GLES2DecoderRestoreStateTest, DefaultUnit0) {
// Expect to restore active texture unit to GL_TEXTURE1.
AddExpectationsForActiveTexture(GL_TEXTURE1);
- GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
+ GetDecoder()->RestoreAllTextureUnitAndSamplerBindings(&prev_state);
}
TEST_P(GLES2DecoderRestoreStateTest, DefaultUnit1) {
@@ -373,7 +401,88 @@ TEST_P(GLES2DecoderRestoreStateTest, DefaultUnit1) {
// Expect to restore active texture unit to GL_TEXTURE0.
AddExpectationsForActiveTexture(GL_TEXTURE0);
- GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
+ GetDecoder()->RestoreAllTextureUnitAndSamplerBindings(&prev_state);
+}
+
+TEST_P(GLES2DecoderRestoreStateTest, ES3NullPreviousStateWithSampler) {
+ // This ES3-specific test is scoped within GLES2DecoderRestoreStateTest
+ // to avoid doing large refactorings of these tests.
+ InitState init;
+ init.gl_version = "OpenGL ES 3.0";
+ init.context_type = CONTEXT_TYPE_OPENGLES3;
+ InitDecoder(init);
+ SetupTexture();
+ SetupSampler();
+
+ InSequence sequence;
+ // Expect to restore texture bindings for unit GL_TEXTURE0.
+ AddExpectationsForActiveTexture(GL_TEXTURE0);
+ AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
+ AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, 0);
+ // Expect to restore sampler binding for unit GL_TEXTURE0.
+ AddExpectationsForBindSampler(0, kServiceSamplerId);
+
+ // Expect to restore texture bindings for remaining units.
+ for (uint32_t i = 1; i < group().max_texture_units(); ++i) {
+ AddExpectationsForActiveTexture(GL_TEXTURE0 + i);
+ AddExpectationsForBindTexture(GL_TEXTURE_2D, 0);
+ AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, 0);
+ AddExpectationsForBindSampler(i, 0);
+ }
+
+ // Expect to restore the active texture unit to GL_TEXTURE0.
+ AddExpectationsForActiveTexture(GL_TEXTURE0);
+
+ GetDecoder()->RestoreAllTextureUnitAndSamplerBindings(NULL);
+}
+
+TEST_P(GLES2DecoderRestoreStateTest, ES3RestoreExistingSampler) {
+ // This ES3-specific test is scoped within GLES2DecoderRestoreStateTest
+ // to avoid doing large refactorings of these tests.
+ auto feature_info = SetupForES3Test();
+ SetupSampler();
+
+ // Construct a previous ContextState assuming an ES3 context and with all
+ // texture bindings set to default textures.
+ ContextState prev_state(feature_info.get(), NULL, NULL);
+ InitializeContextState(&prev_state, std::numeric_limits<uint32_t>::max(), 0);
+
+ InSequence sequence;
+ // Expect to restore sampler binding for unit GL_TEXTURE0.
+ AddExpectationsForBindSampler(0, kServiceSamplerId);
+
+ // Expect to restore the active texture unit to GL_TEXTURE0.
+ AddExpectationsForActiveTexture(GL_TEXTURE0);
+
+ GetDecoder()->RestoreAllTextureUnitAndSamplerBindings(&prev_state);
+}
+
+TEST_P(GLES2DecoderRestoreStateTest, ES3RestoreZeroSampler) {
+ // This ES3-specific test is scoped within GLES2DecoderRestoreStateTest
+ // to avoid doing large refactorings of these tests.
+ auto feature_info = SetupForES3Test();
+
+ // Construct a previous ContextState assuming an ES3 context and with all
+ // texture bindings set to default textures.
+ SamplerManager sampler_manager(feature_info.get());
+ ContextState prev_state(feature_info.get(), NULL, NULL);
+ InitializeContextState(&prev_state, std::numeric_limits<uint32_t>::max(), 0);
+ // Set up a sampler in the previous state. The client_id and service_id
+ // don't matter except that they're non-zero.
+ prev_state.sampler_units[0] = new Sampler(&sampler_manager, 1, 2);
+
+ InSequence sequence;
+ // Expect to restore the zero sampler on unit GL_TEXTURE0.
+ AddExpectationsForBindSampler(0, 0);
+
+ // Expect to restore the active texture unit to GL_TEXTURE0.
+ AddExpectationsForActiveTexture(GL_TEXTURE0);
+
+ GetDecoder()->RestoreAllTextureUnitAndSamplerBindings(&prev_state);
+
+ // Tell the sampler manager to destroy itself without a context so we
+ // don't have to set up more expectations.
+ sampler_manager.Destroy(false);
}
TEST_P(GLES2DecoderManualInitTest, ContextStateCapabilityCaching) {
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc ('k') | ui/gl/gl_state_restorer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698