OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2009, Google Inc. | 2 * Copyright 2009, Google Inc. |
3 * All rights reserved. | 3 * All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 18 matching lines...) Expand all Loading... |
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
30 */ | 30 */ |
31 | 31 |
32 | 32 |
33 #include "core/cross/precompile.h" | 33 #include "core/cross/precompile.h" |
34 #include "tests/common/win/testing_common.h" | 34 #include "tests/common/win/testing_common.h" |
35 #include "core/cross/client.h" | 35 #include "core/cross/client.h" |
36 #include "core/cross/pack.h" | 36 #include "core/cross/pack.h" |
37 #include "core/cross/renderer.h" | 37 #include "core/cross/renderer.h" |
38 #include "core/cross/bitmap.h" | 38 #include "core/cross/bitmap.h" |
| 39 #include "core/cross/features.h" |
39 #include "core/cross/texture.h" | 40 #include "core/cross/texture.h" |
40 #include "core/cross/render_surface.h" | 41 #include "core/cross/render_surface.h" |
41 #include "core/cross/render_surface_set.h" | 42 #include "core/cross/render_surface_set.h" |
42 #include "core/cross/renderer_platform.h" | 43 #include "core/cross/renderer_platform.h" |
43 #include "core/cross/error_status.h" | 44 #include "core/cross/error_status.h" |
44 | 45 |
45 // Defined in testing_common.cc, for each platform. | 46 // Defined in testing_common.cc, for each platform. |
46 extern o3d::DisplayWindow* g_display_window; | 47 extern o3d::DisplayWindow *g_display_window; |
47 | 48 |
48 namespace o3d { | 49 namespace o3d { |
49 | 50 |
| 51 // A mock render which pushes commands to the renderer so that |
| 52 // actual rendering calls that maintain state can be handled by a |
| 53 // variable rather than actually rendering. |
| 54 class MockRenderer { |
| 55 public: |
| 56 // Creates a forwarding render class that pushes functionality to be tested |
| 57 // to the desired renderer and handles other functionality on its own. |
| 58 explicit MockRenderer(Renderer *renderer) : renderer_(renderer) {} |
| 59 |
| 60 virtual ~MockRenderer() {} |
| 61 |
| 62 // Rather than actually rendering, this just sets the state in the renderer. |
| 63 void StartRendering() { |
| 64 renderer_->set_rendering(true); |
| 65 } |
| 66 |
| 67 // This resets the state in the renderer. |
| 68 void FinishRendering() { |
| 69 renderer_->set_rendering(false); |
| 70 } |
| 71 |
| 72 // Pushes SetRenderSurfaces to the renderer. |
| 73 void SetRenderSurfaces(const RenderSurface *surface, |
| 74 const RenderDepthStencilSurface *depth_surface, |
| 75 bool is_back_buffer) { |
| 76 renderer_->SetRenderSurfaces(surface, depth_surface, is_back_buffer); |
| 77 } |
| 78 |
| 79 // Pushes GetRenderSurfaces to the renderer. |
| 80 void GetRenderSurfaces(const RenderSurface **surface, |
| 81 const RenderDepthStencilSurface **depth_surface, |
| 82 bool *is_back_buffer) { |
| 83 renderer_->GetRenderSurfaces(surface, depth_surface, is_back_buffer); |
| 84 } |
| 85 private: |
| 86 Renderer *renderer_; |
| 87 }; |
| 88 |
| 89 // Class for testing render surfaces and associated functionality. |
50 class RenderSurfaceTest : public testing::Test { | 90 class RenderSurfaceTest : public testing::Test { |
51 public: | 91 public: |
52 RenderSurfaceTest() | 92 RenderSurfaceTest() |
53 : object_manager_(g_service_locator), | 93 : object_manager_(g_service_locator), |
54 error_status_(g_service_locator) { | 94 error_status_(g_service_locator) {} |
55 } | |
56 | |
57 Renderer* renderer() { | |
58 return g_renderer; | |
59 } | |
60 | 95 |
61 protected: | 96 protected: |
62 virtual void SetUp() { | 97 virtual void SetUp() { |
| 98 service_locator_ = new ServiceLocator; |
| 99 features_ = new Features(service_locator_); |
63 pack_ = object_manager_->CreatePack(); | 100 pack_ = object_manager_->CreatePack(); |
64 g_renderer->StartRendering(); | 101 renderer_ = new MockRenderer(g_renderer); |
| 102 renderer_->StartRendering(); |
65 } | 103 } |
66 | 104 |
67 virtual void TearDown() { | 105 virtual void TearDown() { |
68 g_renderer->FinishRendering(); | 106 renderer_->FinishRendering(); |
69 pack_->Destroy(); | 107 pack_->Destroy(); |
70 error_status_.ClearLastError(); | 108 error_status_.ClearLastError(); |
| 109 delete features_; |
| 110 delete service_locator_; |
| 111 delete renderer_; |
71 } | 112 } |
72 | 113 |
73 Pack* pack() { return pack_; } | 114 ServiceLocator* service_locator() const { |
| 115 return service_locator_; |
| 116 } |
| 117 |
| 118 MockRenderer* renderer() const { |
| 119 return renderer_; |
| 120 } |
| 121 |
| 122 Pack* pack() const { |
| 123 return pack_; |
| 124 } |
74 | 125 |
75 ServiceDependency<ObjectManager> object_manager_; | 126 ServiceDependency<ObjectManager> object_manager_; |
76 ErrorStatus error_status_; | 127 ErrorStatus error_status_; |
77 Pack* pack_; | 128 ServiceLocator *service_locator_; |
| 129 Features *features_; |
| 130 Pack *pack_; |
| 131 MockRenderer *renderer_; |
78 }; | 132 }; |
79 | 133 |
80 // Test that non PoT textures can't make render surfaces | 134 // Tests that non PoT textures can't make render surfaces. |
81 TEST_F(RenderSurfaceTest, NonPowerOfTwoRenderSurfaceEnabled) { | 135 TEST_F(RenderSurfaceTest, NonPowerOfTwoRenderSurfaceEnabled) { |
82 Texture2D* texture = pack()->CreateTexture2D(20, 32, Texture::ARGB8, 2, true); | 136 Texture2D *texture = pack()->CreateTexture2D(20, 32, Texture::ARGB8, 2, true); |
83 ASSERT_TRUE(NULL == texture); | 137 ASSERT_TRUE(NULL == texture); |
84 } | 138 } |
85 // Test that a render surface can be created | 139 |
| 140 // Tests that a render surface can be created from a texture 2d. |
86 TEST_F(RenderSurfaceTest, CreateRenderSurfaceFromTexture2D) { | 141 TEST_F(RenderSurfaceTest, CreateRenderSurfaceFromTexture2D) { |
87 Texture2D* texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true); | 142 Texture2D *texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true); |
88 ASSERT_TRUE(NULL != texture); | 143 ASSERT_TRUE(NULL != texture); |
89 | 144 |
90 RenderSurface::Ref render_surface = texture->GetRenderSurface(0); | 145 RenderSurface::Ref render_surface = texture->GetRenderSurface(0); |
91 ASSERT_TRUE(NULL != render_surface); | 146 ASSERT_TRUE(NULL != render_surface); |
92 ASSERT_TRUE(NULL != render_surface->texture()); | 147 ASSERT_TRUE(NULL != render_surface->texture()); |
93 ASSERT_EQ(render_surface->width(), 16); | 148 ASSERT_EQ(render_surface->width(), 16); |
94 ASSERT_EQ(render_surface->height(), 32); | 149 ASSERT_EQ(render_surface->height(), 32); |
95 } | 150 } |
96 | 151 |
| 152 // Tests that a render surface can be created from a cube texture. |
97 TEST_F(RenderSurfaceTest, CreateRenderSurfaceFromTextureCUBE) { | 153 TEST_F(RenderSurfaceTest, CreateRenderSurfaceFromTextureCUBE) { |
98 TextureCUBE* texture = pack()->CreateTextureCUBE(16, Texture::ARGB8, 2, true); | 154 TextureCUBE *texture = pack()->CreateTextureCUBE(16, Texture::ARGB8, 2, true); |
99 ASSERT_TRUE(NULL != texture); | 155 ASSERT_TRUE(NULL != texture); |
100 | 156 |
101 RenderSurface::Ref render_surface = texture->GetRenderSurface( | 157 RenderSurface::Ref render_surface = texture->GetRenderSurface( |
102 TextureCUBE::FACE_POSITIVE_X, 0); | 158 TextureCUBE::FACE_POSITIVE_X, 0); |
103 ASSERT_TRUE(NULL != render_surface); | 159 ASSERT_TRUE(NULL != render_surface); |
104 ASSERT_TRUE(NULL != render_surface->texture()); | 160 ASSERT_TRUE(NULL != render_surface->texture()); |
105 ASSERT_EQ(render_surface->width(), 16); | 161 ASSERT_EQ(render_surface->width(), 16); |
106 ASSERT_EQ(render_surface->height(), 16); | 162 ASSERT_EQ(render_surface->height(), 16); |
107 } | 163 } |
108 | 164 |
| 165 // Tests the renderer's functionality to swap render surfaces and that |
| 166 // the correct render surfaces are set. |
109 TEST_F(RenderSurfaceTest, SwapRenderSurfaces) { | 167 TEST_F(RenderSurfaceTest, SwapRenderSurfaces) { |
110 Texture2D* texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true); | 168 Texture2D *texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true); |
111 ASSERT_TRUE(NULL != texture); | 169 ASSERT_TRUE(NULL != texture); |
112 | 170 |
113 RenderSurface::Ref render_surface = texture->GetRenderSurface(0); | 171 RenderSurface::Ref render_surface = texture->GetRenderSurface(0); |
114 ASSERT_TRUE(NULL != render_surface); | 172 ASSERT_TRUE(NULL != render_surface); |
115 ASSERT_TRUE(texture == render_surface->texture()); | 173 ASSERT_TRUE(texture == render_surface->texture()); |
116 | 174 |
117 RenderDepthStencilSurface* depth_surface = | 175 RenderDepthStencilSurface *depth_surface = |
118 pack()->CreateDepthStencilSurface(16, 32); | 176 pack()->CreateDepthStencilSurface(16, 32); |
119 | 177 |
120 // Now swap surfaces. | 178 // Now swap surfaces. |
121 renderer()->SetRenderSurfaces(render_surface, depth_surface, false); | 179 renderer()->SetRenderSurfaces(render_surface, depth_surface, false); |
122 const RenderSurface* test_render_surface = NULL; | 180 const RenderSurface *test_render_surface = NULL; |
123 const RenderDepthStencilSurface* test_depth_surface = NULL; | 181 const RenderDepthStencilSurface *test_depth_surface = NULL; |
124 bool test_is_back_buffer; | 182 bool test_is_back_buffer; |
125 renderer()->GetRenderSurfaces(&test_render_surface, &test_depth_surface, | 183 renderer()->GetRenderSurfaces(&test_render_surface, &test_depth_surface, |
126 &test_is_back_buffer); | 184 &test_is_back_buffer); |
127 ASSERT_TRUE(test_render_surface == render_surface); | 185 ASSERT_TRUE(test_render_surface == render_surface); |
128 ASSERT_TRUE(test_depth_surface == depth_surface); | 186 ASSERT_TRUE(test_depth_surface == depth_surface); |
129 ASSERT_FALSE(test_is_back_buffer); | 187 ASSERT_FALSE(test_is_back_buffer); |
130 } | 188 } |
131 | 189 |
132 TEST_F(RenderSurfaceTest, RenderSurfaceSetTest) { | 190 // Tests the renderer's functionality to swap render surfaces and return |
133 Texture2D* texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true); | 191 // the old one to the main rendering surface. |
| 192 TEST_F(RenderSurfaceTest, SetBackSurfaces) { |
| 193 Texture2D *texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true); |
134 ASSERT_TRUE(NULL != texture); | 194 ASSERT_TRUE(NULL != texture); |
135 | 195 |
136 RenderSurface::Ref render_surface = texture->GetRenderSurface(0); | 196 RenderSurface::Ref render_surface = texture->GetRenderSurface(0); |
137 ASSERT_TRUE(NULL != render_surface); | 197 ASSERT_TRUE(NULL != render_surface); |
138 ASSERT_TRUE(texture == render_surface->texture()); | 198 ASSERT_TRUE(texture == render_surface->texture()); |
139 | 199 |
140 RenderDepthStencilSurface* depth_surface = | 200 RenderDepthStencilSurface *depth_surface = |
141 pack()->CreateDepthStencilSurface(16, 32); | 201 pack()->CreateDepthStencilSurface(16, 32); |
| 202 |
| 203 // Save the original surfaces for comparison. |
| 204 const RenderSurface *original_render_surface = NULL; |
| 205 const RenderDepthStencilSurface *original_depth_surface = NULL; |
| 206 bool original_is_back_buffer; |
| 207 renderer()->GetRenderSurfaces(&original_render_surface, |
| 208 &original_depth_surface, |
| 209 &original_is_back_buffer); |
| 210 // Now swap surfaces. |
| 211 renderer()->SetRenderSurfaces(render_surface, depth_surface, false); |
| 212 // Return the back buffers |
| 213 renderer()->SetRenderSurfaces(NULL, NULL, true); |
| 214 // Get the original surfaces again for comparison. |
| 215 const RenderSurface *restored_render_surface = NULL; |
| 216 const RenderDepthStencilSurface *restored_depth_surface = NULL; |
| 217 bool restored_is_back_buffer; |
| 218 renderer()->GetRenderSurfaces(&original_render_surface, |
| 219 &original_depth_surface, |
| 220 &restored_is_back_buffer); |
| 221 ASSERT_TRUE(original_render_surface == restored_render_surface); |
| 222 ASSERT_TRUE(original_depth_surface == restored_depth_surface); |
| 223 ASSERT_TRUE(restored_is_back_buffer); |
| 224 } |
| 225 |
| 226 // Tests the render surfaces interaction as part of a render surface set |
| 227 // which is how they are commonly used in practice. |
| 228 TEST_F(RenderSurfaceTest, RenderSurfaceSetTest) { |
| 229 Texture2D *texture = pack()->CreateTexture2D(16, 32, Texture::ARGB8, 2, true); |
| 230 ASSERT_TRUE(NULL != texture); |
| 231 |
| 232 RenderSurface::Ref render_surface = texture->GetRenderSurface(0); |
| 233 ASSERT_TRUE(NULL != render_surface); |
| 234 ASSERT_TRUE(texture == render_surface->texture()); |
| 235 |
| 236 RenderDepthStencilSurface *depth_surface = |
| 237 pack()->CreateDepthStencilSurface(16, 32); |
142 ASSERT_TRUE(depth_surface != NULL); | 238 ASSERT_TRUE(depth_surface != NULL); |
143 | 239 |
144 RenderSurfaceSet* render_surface_set = pack()->Create<RenderSurfaceSet>(); | 240 RenderSurfaceSet *render_surface_set = pack()->Create<RenderSurfaceSet>(); |
145 ASSERT_TRUE(render_surface_set != NULL); | 241 ASSERT_TRUE(render_surface_set != NULL); |
146 render_surface_set->set_render_surface(render_surface); | 242 render_surface_set->set_render_surface(render_surface); |
147 render_surface_set->set_render_depth_stencil_surface(depth_surface); | 243 render_surface_set->set_render_depth_stencil_surface(depth_surface); |
148 ASSERT_TRUE(render_surface_set->ValidateBoundSurfaces()); | 244 ASSERT_TRUE(render_surface_set->ValidateBoundSurfaces()); |
149 | 245 |
150 RenderContext render_context(g_renderer); | 246 RenderContext render_context(g_renderer); |
151 | 247 |
152 const RenderSurface* old_render_surface = NULL; | 248 const RenderSurface *old_render_surface = NULL; |
153 const RenderDepthStencilSurface* old_depth_surface = NULL; | 249 const RenderDepthStencilSurface *old_depth_surface = NULL; |
154 bool old_is_back_buffer = false; | 250 bool old_is_back_buffer = false; |
155 renderer()->GetRenderSurfaces(&old_render_surface, &old_depth_surface, | 251 renderer()->GetRenderSurfaces(&old_render_surface, &old_depth_surface, |
156 &old_is_back_buffer); | 252 &old_is_back_buffer); |
157 | 253 |
158 render_surface_set->Render(&render_context); | 254 render_surface_set->Render(&render_context); |
159 const RenderSurface* test_render_surface = NULL; | 255 const RenderSurface *test_render_surface = NULL; |
160 const RenderDepthStencilSurface* test_depth_surface = NULL; | 256 const RenderDepthStencilSurface *test_depth_surface = NULL; |
161 bool test_is_back_buffer = false; | 257 bool test_is_back_buffer = false; |
162 renderer()->GetRenderSurfaces(&test_render_surface, &test_depth_surface, | 258 renderer()->GetRenderSurfaces(&test_render_surface, &test_depth_surface, |
163 &test_is_back_buffer); | 259 &test_is_back_buffer); |
164 ASSERT_TRUE(test_render_surface == render_surface); | 260 ASSERT_TRUE(test_render_surface == render_surface); |
165 ASSERT_TRUE(test_depth_surface == depth_surface); | 261 ASSERT_TRUE(test_depth_surface == depth_surface); |
166 ASSERT_FALSE(test_is_back_buffer); | 262 ASSERT_FALSE(test_is_back_buffer); |
167 | 263 |
168 render_surface_set->PostRender(&render_context); | 264 render_surface_set->PostRender(&render_context); |
169 renderer()->GetRenderSurfaces(&test_render_surface, &test_depth_surface, | 265 renderer()->GetRenderSurfaces(&test_render_surface, &test_depth_surface, |
170 &test_is_back_buffer); | 266 &test_is_back_buffer); |
171 ASSERT_TRUE(test_render_surface == old_render_surface); | 267 ASSERT_TRUE(test_render_surface == old_render_surface); |
172 ASSERT_TRUE(test_depth_surface == old_depth_surface); | 268 ASSERT_TRUE(test_depth_surface == old_depth_surface); |
173 ASSERT_TRUE(test_is_back_buffer == old_is_back_buffer); | 269 ASSERT_TRUE(test_is_back_buffer == old_is_back_buffer); |
174 } | 270 } |
175 | 271 |
176 } // namespace o3d | 272 } // namespace o3d |
177 | 273 |
OLD | NEW |