summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorGravatar Narr the Reg2022-11-20 09:31:20 -0600
committerGravatar GitHub2022-11-20 09:31:20 -0600
commitdb7bcd51ae09c4ef25e08096de563903f61e2380 (patch)
tree5ae9977b48e1aff118fae3ebffb215b0b4afa887 /src/video_core
parentservice: nfc: Implement nfc user (diff)
parentMerge pull request #9238 from german77/cabinet_applet (diff)
downloadyuzu-db7bcd51ae09c4ef25e08096de563903f61e2380.tar.gz
yuzu-db7bcd51ae09c4ef25e08096de563903f61e2380.tar.xz
yuzu-db7bcd51ae09c4ef25e08096de563903f61e2380.zip
Merge branch 'master' into nfc_impl
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/engines/maxwell_3d.cpp6
-rw-r--r--src/video_core/engines/maxwell_3d.h6
-rw-r--r--src/video_core/engines/maxwell_dma.cpp1
-rw-r--r--src/video_core/engines/puller.cpp4
-rw-r--r--src/video_core/macro/macro_hle.cpp16
-rw-r--r--src/video_core/macro/macro_interpreter.cpp2
-rw-r--r--src/video_core/macro/macro_jit_x64.cpp1
-rw-r--r--src/video_core/rasterizer_interface.h2
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp2
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h2
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp2
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp1
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.cpp4
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp4
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.h2
-rw-r--r--src/video_core/renderer_vulkan/vk_scheduler.cpp1
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp1
-rw-r--r--src/video_core/textures/decoders.cpp3
18 files changed, 47 insertions, 13 deletions
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp
index d502d181c..5bb1427c1 100644
--- a/src/video_core/engines/maxwell_3d.cpp
+++ b/src/video_core/engines/maxwell_3d.cpp
@@ -232,7 +232,7 @@ void Maxwell3D::ProcessMethodCall(u32 method, u32 argument, u32 nonshadow_argume
232 use_topology_override = true; 232 use_topology_override = true;
233 return; 233 return;
234 case MAXWELL3D_REG_INDEX(clear_surface): 234 case MAXWELL3D_REG_INDEX(clear_surface):
235 return ProcessClearBuffers(); 235 return ProcessClearBuffers(1);
236 case MAXWELL3D_REG_INDEX(report_semaphore.query): 236 case MAXWELL3D_REG_INDEX(report_semaphore.query):
237 return ProcessQueryGet(); 237 return ProcessQueryGet();
238 case MAXWELL3D_REG_INDEX(render_enable.mode): 238 case MAXWELL3D_REG_INDEX(render_enable.mode):
@@ -596,8 +596,8 @@ u32 Maxwell3D::GetRegisterValue(u32 method) const {
596 return regs.reg_array[method]; 596 return regs.reg_array[method];
597} 597}
598 598
599void Maxwell3D::ProcessClearBuffers() { 599void Maxwell3D::ProcessClearBuffers(u32 layer_count) {
600 rasterizer->Clear(); 600 rasterizer->Clear(layer_count);
601} 601}
602 602
603void Maxwell3D::ProcessDraw(u32 instance_count) { 603void Maxwell3D::ProcessDraw(u32 instance_count) {
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h
index 34b085388..c3099f9a6 100644
--- a/src/video_core/engines/maxwell_3d.h
+++ b/src/video_core/engines/maxwell_3d.h
@@ -3086,6 +3086,9 @@ public:
3086 3086
3087 std::vector<u8> inline_index_draw_indexes; 3087 std::vector<u8> inline_index_draw_indexes;
3088 3088
3089 /// Handles a write to the CLEAR_BUFFERS register.
3090 void ProcessClearBuffers(u32 layer_count);
3091
3089private: 3092private:
3090 void InitializeRegisterDefaults(); 3093 void InitializeRegisterDefaults();
3091 3094
@@ -3120,9 +3123,6 @@ private:
3120 /// Handles firmware blob 4 3123 /// Handles firmware blob 4
3121 void ProcessFirmwareCall4(); 3124 void ProcessFirmwareCall4();
3122 3125
3123 /// Handles a write to the CLEAR_BUFFERS register.
3124 void ProcessClearBuffers();
3125
3126 /// Handles a write to the QUERY_GET register. 3126 /// Handles a write to the QUERY_GET register.
3127 void ProcessQueryGet(); 3127 void ProcessQueryGet();
3128 3128
diff --git a/src/video_core/engines/maxwell_dma.cpp b/src/video_core/engines/maxwell_dma.cpp
index 54523a4b2..1bf6ca2dd 100644
--- a/src/video_core/engines/maxwell_dma.cpp
+++ b/src/video_core/engines/maxwell_dma.cpp
@@ -314,6 +314,7 @@ void MaxwellDMA::ReleaseSemaphore() {
314 } 314 }
315 default: 315 default:
316 ASSERT_MSG(false, "Unknown semaphore type: {}", static_cast<u32>(type.Value())); 316 ASSERT_MSG(false, "Unknown semaphore type: {}", static_cast<u32>(type.Value()));
317 break;
317 } 318 }
318} 319}
319 320
diff --git a/src/video_core/engines/puller.cpp b/src/video_core/engines/puller.cpp
index 3977bb0fb..4d2278811 100644
--- a/src/video_core/engines/puller.cpp
+++ b/src/video_core/engines/puller.cpp
@@ -50,6 +50,7 @@ void Puller::ProcessBindMethod(const MethodCall& method_call) {
50 break; 50 break;
51 default: 51 default:
52 UNIMPLEMENTED_MSG("Unimplemented engine {:04X}", engine_id); 52 UNIMPLEMENTED_MSG("Unimplemented engine {:04X}", engine_id);
53 break;
53 } 54 }
54} 55}
55 56
@@ -65,6 +66,7 @@ void Puller::ProcessFenceActionMethod() {
65 break; 66 break;
66 default: 67 default:
67 UNIMPLEMENTED_MSG("Unimplemented operation {}", regs.fence_action.op.Value()); 68 UNIMPLEMENTED_MSG("Unimplemented operation {}", regs.fence_action.op.Value());
69 break;
68 } 70 }
69} 71}
70 72
@@ -228,6 +230,7 @@ void Puller::CallEngineMethod(const MethodCall& method_call) {
228 break; 230 break;
229 default: 231 default:
230 UNIMPLEMENTED_MSG("Unimplemented engine"); 232 UNIMPLEMENTED_MSG("Unimplemented engine");
233 break;
231 } 234 }
232} 235}
233 236
@@ -254,6 +257,7 @@ void Puller::CallEngineMultiMethod(u32 method, u32 subchannel, const u32* base_s
254 break; 257 break;
255 default: 258 default:
256 UNIMPLEMENTED_MSG("Unimplemented engine"); 259 UNIMPLEMENTED_MSG("Unimplemented engine");
260 break;
257 } 261 }
258} 262}
259 263
diff --git a/src/video_core/macro/macro_hle.cpp b/src/video_core/macro/macro_hle.cpp
index f896591bf..0f3262edb 100644
--- a/src/video_core/macro/macro_hle.cpp
+++ b/src/video_core/macro/macro_hle.cpp
@@ -126,11 +126,25 @@ void HLE_3F5E74B9C9A50164(Engines::Maxwell3D& maxwell3d, const std::vector<u32>&
126 } 126 }
127} 127}
128 128
129constexpr std::array<std::pair<u64, HLEFunction>, 4> hle_funcs{{ 129// Multi-layer Clear
130void HLE_EAD26C3E2109B06B(Engines::Maxwell3D& maxwell3d, const std::vector<u32>& parameters) {
131 ASSERT(parameters.size() == 1);
132
133 const Engines::Maxwell3D::Regs::ClearSurface clear_params{parameters[0]};
134 const u32 rt_index = clear_params.RT;
135 const u32 num_layers = maxwell3d.regs.rt[rt_index].depth;
136 ASSERT(clear_params.layer == 0);
137
138 maxwell3d.regs.clear_surface.raw = clear_params.raw;
139 maxwell3d.ProcessClearBuffers(num_layers);
140}
141
142constexpr std::array<std::pair<u64, HLEFunction>, 5> hle_funcs{{
130 {0x771BB18C62444DA0, &HLE_771BB18C62444DA0}, 143 {0x771BB18C62444DA0, &HLE_771BB18C62444DA0},
131 {0x0D61FC9FAAC9FCAD, &HLE_0D61FC9FAAC9FCAD}, 144 {0x0D61FC9FAAC9FCAD, &HLE_0D61FC9FAAC9FCAD},
132 {0x0217920100488FF7, &HLE_0217920100488FF7}, 145 {0x0217920100488FF7, &HLE_0217920100488FF7},
133 {0x3F5E74B9C9A50164, &HLE_3F5E74B9C9A50164}, 146 {0x3F5E74B9C9A50164, &HLE_3F5E74B9C9A50164},
147 {0xEAD26C3E2109B06B, &HLE_EAD26C3E2109B06B},
134}}; 148}};
135 149
136class HLEMacroImpl final : public CachedMacro { 150class HLEMacroImpl final : public CachedMacro {
diff --git a/src/video_core/macro/macro_interpreter.cpp b/src/video_core/macro/macro_interpreter.cpp
index c0d32c112..0d63495a9 100644
--- a/src/video_core/macro/macro_interpreter.cpp
+++ b/src/video_core/macro/macro_interpreter.cpp
@@ -201,6 +201,7 @@ bool MacroInterpreterImpl::Step(bool is_delay_slot) {
201 } 201 }
202 default: 202 default:
203 UNIMPLEMENTED_MSG("Unimplemented macro operation {}", opcode.operation.Value()); 203 UNIMPLEMENTED_MSG("Unimplemented macro operation {}", opcode.operation.Value());
204 break;
204 } 205 }
205 206
206 // An instruction with the Exit flag will not actually 207 // An instruction with the Exit flag will not actually
@@ -297,6 +298,7 @@ void MacroInterpreterImpl::ProcessResult(Macro::ResultOperation operation, u32 r
297 break; 298 break;
298 default: 299 default:
299 UNIMPLEMENTED_MSG("Unimplemented result operation {}", operation); 300 UNIMPLEMENTED_MSG("Unimplemented result operation {}", operation);
301 break;
300 } 302 }
301} 303}
302 304
diff --git a/src/video_core/macro/macro_jit_x64.cpp b/src/video_core/macro/macro_jit_x64.cpp
index 25c1ce798..7347cbd88 100644
--- a/src/video_core/macro/macro_jit_x64.cpp
+++ b/src/video_core/macro/macro_jit_x64.cpp
@@ -652,6 +652,7 @@ void MacroJITx64Impl::Compile_ProcessResult(Macro::ResultOperation operation, u3
652 break; 652 break;
653 default: 653 default:
654 UNIMPLEMENTED_MSG("Unimplemented macro operation {}", operation); 654 UNIMPLEMENTED_MSG("Unimplemented macro operation {}", operation);
655 break;
655 } 656 }
656} 657}
657 658
diff --git a/src/video_core/rasterizer_interface.h b/src/video_core/rasterizer_interface.h
index 1cbfef090..cfd872a40 100644
--- a/src/video_core/rasterizer_interface.h
+++ b/src/video_core/rasterizer_interface.h
@@ -43,7 +43,7 @@ public:
43 virtual void Draw(bool is_indexed, u32 instance_count) = 0; 43 virtual void Draw(bool is_indexed, u32 instance_count) = 0;
44 44
45 /// Clear the current framebuffer 45 /// Clear the current framebuffer
46 virtual void Clear() = 0; 46 virtual void Clear(u32 layer_count) = 0;
47 47
48 /// Dispatches a compute shader invocation 48 /// Dispatches a compute shader invocation
49 virtual void DispatchCompute() = 0; 49 virtual void DispatchCompute() = 0;
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index d05a5f60b..115a5e010 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -136,7 +136,7 @@ void RasterizerOpenGL::LoadDiskResources(u64 title_id, std::stop_token stop_load
136 shader_cache.LoadDiskResources(title_id, stop_loading, callback); 136 shader_cache.LoadDiskResources(title_id, stop_loading, callback);
137} 137}
138 138
139void RasterizerOpenGL::Clear() { 139void RasterizerOpenGL::Clear(u32 layer_count) {
140 MICROPROFILE_SCOPE(OpenGL_Clears); 140 MICROPROFILE_SCOPE(OpenGL_Clears);
141 if (!maxwell3d->ShouldExecute()) { 141 if (!maxwell3d->ShouldExecute()) {
142 return; 142 return;
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index 793e0d608..449a14f12 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -69,7 +69,7 @@ public:
69 ~RasterizerOpenGL() override; 69 ~RasterizerOpenGL() override;
70 70
71 void Draw(bool is_indexed, u32 instance_count) override; 71 void Draw(bool is_indexed, u32 instance_count) override;
72 void Clear() override; 72 void Clear(u32 layer_count) override;
73 void DispatchCompute() override; 73 void DispatchCompute() override;
74 void ResetCounter(VideoCore::QueryType type) override; 74 void ResetCounter(VideoCore::QueryType type) override;
75 void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) override; 75 void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) override;
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp
index 99cd11d1e..9f7ce7414 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp
@@ -891,6 +891,7 @@ void Image::CopyBufferToImage(const VideoCommon::BufferImageCopy& copy, size_t b
891 break; 891 break;
892 default: 892 default:
893 ASSERT(false); 893 ASSERT(false);
894 break;
894 } 895 }
895} 896}
896 897
@@ -927,6 +928,7 @@ void Image::CopyImageToBuffer(const VideoCommon::BufferImageCopy& copy, size_t b
927 break; 928 break;
928 default: 929 default:
929 ASSERT(false); 930 ASSERT(false);
931 break;
930 } 932 }
931 // Compressed formats don't have a pixel format or type 933 // Compressed formats don't have a pixel format or type
932 const bool is_compressed = gl_format == GL_NONE; 934 const bool is_compressed = gl_format == GL_NONE;
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp
index 8bd5eba7e..f29462f7c 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.cpp
+++ b/src/video_core/renderer_opengl/renderer_opengl.cpp
@@ -340,6 +340,7 @@ void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture,
340 texture.gl_type = GL_UNSIGNED_INT_8_8_8_8_REV; 340 texture.gl_type = GL_UNSIGNED_INT_8_8_8_8_REV;
341 // UNIMPLEMENTED_MSG("Unknown framebuffer pixel format: {}", 341 // UNIMPLEMENTED_MSG("Unknown framebuffer pixel format: {}",
342 // static_cast<u32>(framebuffer.pixel_format)); 342 // static_cast<u32>(framebuffer.pixel_format));
343 break;
343 } 344 }
344 345
345 texture.resource.Release(); 346 texture.resource.Release();
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
index d8131232a..c2a95200b 100644
--- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp
+++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
@@ -172,6 +172,7 @@ void RendererVulkan::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) {
172} 172}
173 173
174void RendererVulkan::Report() const { 174void RendererVulkan::Report() const {
175 using namespace Common::Literals;
175 const std::string vendor_name{device.GetVendorName()}; 176 const std::string vendor_name{device.GetVendorName()};
176 const std::string model_name{device.GetModelName()}; 177 const std::string model_name{device.GetModelName()};
177 const std::string driver_version = GetDriverVersion(device); 178 const std::string driver_version = GetDriverVersion(device);
@@ -181,9 +182,12 @@ void RendererVulkan::Report() const {
181 182
182 const std::string extensions = BuildCommaSeparatedExtensions(device.GetAvailableExtensions()); 183 const std::string extensions = BuildCommaSeparatedExtensions(device.GetAvailableExtensions());
183 184
185 const auto available_vram = static_cast<f64>(device.GetDeviceLocalMemory()) / f64{1_GiB};
186
184 LOG_INFO(Render_Vulkan, "Driver: {}", driver_name); 187 LOG_INFO(Render_Vulkan, "Driver: {}", driver_name);
185 LOG_INFO(Render_Vulkan, "Device: {}", model_name); 188 LOG_INFO(Render_Vulkan, "Device: {}", model_name);
186 LOG_INFO(Render_Vulkan, "Vulkan: {}", api_version); 189 LOG_INFO(Render_Vulkan, "Vulkan: {}", api_version);
190 LOG_INFO(Render_Vulkan, "Available VRAM: {:.2f} GiB", available_vram);
187 191
188 static constexpr auto field = Common::Telemetry::FieldType::UserSystem; 192 static constexpr auto field = Common::Telemetry::FieldType::UserSystem;
189 telemetry_session.AddField(field, "GPU_Vendor", vendor_name); 193 telemetry_session.AddField(field, "GPU_Vendor", vendor_name);
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
index f69c0c50f..67b88621a 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -213,7 +213,7 @@ void RasterizerVulkan::Draw(bool is_indexed, u32 instance_count) {
213 EndTransformFeedback(); 213 EndTransformFeedback();
214} 214}
215 215
216void RasterizerVulkan::Clear() { 216void RasterizerVulkan::Clear(u32 layer_count) {
217 MICROPROFILE_SCOPE(Vulkan_Clearing); 217 MICROPROFILE_SCOPE(Vulkan_Clearing);
218 218
219 if (!maxwell3d->ShouldExecute()) { 219 if (!maxwell3d->ShouldExecute()) {
@@ -256,7 +256,7 @@ void RasterizerVulkan::Clear() {
256 .rect = regs.clear_control.use_scissor ? GetScissorState(regs, 0, up_scale, down_shift) 256 .rect = regs.clear_control.use_scissor ? GetScissorState(regs, 0, up_scale, down_shift)
257 : default_scissor, 257 : default_scissor,
258 .baseArrayLayer = regs.clear_surface.layer, 258 .baseArrayLayer = regs.clear_surface.layer,
259 .layerCount = 1, 259 .layerCount = layer_count,
260 }; 260 };
261 if (clear_rect.rect.extent.width == 0 || clear_rect.rect.extent.height == 0) { 261 if (clear_rect.rect.extent.width == 0 || clear_rect.rect.extent.height == 0) {
262 return; 262 return;
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h
index b0bc306f5..70f36d58a 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.h
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.h
@@ -65,7 +65,7 @@ public:
65 ~RasterizerVulkan() override; 65 ~RasterizerVulkan() override;
66 66
67 void Draw(bool is_indexed, u32 instance_count) override; 67 void Draw(bool is_indexed, u32 instance_count) override;
68 void Clear() override; 68 void Clear(u32 layer_count) override;
69 void DispatchCompute() override; 69 void DispatchCompute() override;
70 void ResetCounter(VideoCore::QueryType type) override; 70 void ResetCounter(VideoCore::QueryType type) override;
71 void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) override; 71 void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) override;
diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp
index 7934f2a51..4a7b633b7 100644
--- a/src/video_core/renderer_vulkan/vk_scheduler.cpp
+++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp
@@ -221,6 +221,7 @@ void Scheduler::SubmitExecution(VkSemaphore signal_semaphore, VkSemaphore wait_s
221 [[fallthrough]]; 221 [[fallthrough]];
222 default: 222 default:
223 vk::Check(result); 223 vk::Check(result);
224 break;
224 } 225 }
225 }); 226 });
226 chunk->MarkSubmit(); 227 chunk->MarkSubmit();
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index 853b80d8a..a65bbeb1c 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -108,6 +108,7 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
108 break; 108 break;
109 default: 109 default:
110 ASSERT_MSG(false, "Invalid surface type"); 110 ASSERT_MSG(false, "Invalid surface type");
111 break;
111 } 112 }
112 } 113 }
113 if (info.storage) { 114 if (info.storage) {
diff --git a/src/video_core/textures/decoders.cpp b/src/video_core/textures/decoders.cpp
index fd1a4b987..59120cd09 100644
--- a/src/video_core/textures/decoders.cpp
+++ b/src/video_core/textures/decoders.cpp
@@ -170,6 +170,7 @@ void Swizzle(std::span<u8> output, std::span<const u8> input, u32 bytes_per_pixe
170#undef BPP_CASE 170#undef BPP_CASE
171 default: 171 default:
172 ASSERT_MSG(false, "Invalid bytes_per_pixel={}", bytes_per_pixel); 172 ASSERT_MSG(false, "Invalid bytes_per_pixel={}", bytes_per_pixel);
173 break;
173 } 174 }
174} 175}
175 176
@@ -217,6 +218,7 @@ void SwizzleSubrect(std::span<u8> output, std::span<const u8> input, u32 bytes_p
217#undef BPP_CASE 218#undef BPP_CASE
218 default: 219 default:
219 ASSERT_MSG(false, "Invalid bytes_per_pixel={}", bytes_per_pixel); 220 ASSERT_MSG(false, "Invalid bytes_per_pixel={}", bytes_per_pixel);
221 break;
220 } 222 }
221} 223}
222 224
@@ -240,6 +242,7 @@ void UnswizzleSubrect(std::span<u8> output, std::span<const u8> input, u32 bytes
240#undef BPP_CASE 242#undef BPP_CASE
241 default: 243 default:
242 ASSERT_MSG(false, "Invalid bytes_per_pixel={}", bytes_per_pixel); 244 ASSERT_MSG(false, "Invalid bytes_per_pixel={}", bytes_per_pixel);
245 break;
243 } 246 }
244} 247}
245 248