summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar namkazy2020-04-06 13:34:06 +0700
committerGravatar namkazy2020-04-06 13:34:06 +0700
commit9efa51311f1d5cbd4300c23623f4bc8aed88f9a9 (patch)
tree75c92d5203d079ab3b2eef2cb180818395c3c5af /src
parentshader_decode: SULD.D fix conversion error. (diff)
downloadyuzu-9efa51311f1d5cbd4300c23623f4bc8aed88f9a9.tar.gz
yuzu-9efa51311f1d5cbd4300c23623f4bc8aed88f9a9.tar.xz
yuzu-9efa51311f1d5cbd4300c23623f4bc8aed88f9a9.zip
shader_decode: SULD.D avoid duplicate code block.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/shader/decode/image.cpp41
1 files changed, 2 insertions, 39 deletions
diff --git a/src/video_core/shader/decode/image.cpp b/src/video_core/shader/decode/image.cpp
index 96e8db618..242cd6cc1 100644
--- a/src/video_core/shader/decode/image.cpp
+++ b/src/video_core/shader/decode/image.cpp
@@ -272,7 +272,7 @@ std::size_t GetImageTypeNumCoordinates(Tegra::Shader::ImageType image_type) {
272} // Anonymous namespace 272} // Anonymous namespace
273 273
274Node ShaderIR::GetComponentValue(ComponentType component_type, u32 component_size, 274Node ShaderIR::GetComponentValue(ComponentType component_type, u32 component_size,
275 const Node original_value, bool* is_signed) { 275 Node original_value, bool* is_signed) {
276 switch (component_type) { 276 switch (component_type) {
277 case ComponentType::SNORM: { 277 case ComponentType::SNORM: {
278 *is_signed = true; 278 *is_signed = true;
@@ -366,38 +366,7 @@ u32 ShaderIR::DecodeImage(NodeBlock& bb, u32 pc) {
366 const auto comp_mask = GetImageComponentMask(descriptor.format); 366 const auto comp_mask = GetImageComponentMask(descriptor.format);
367 367
368 switch (instr.suldst.GetStoreDataLayout()) { 368 switch (instr.suldst.GetStoreDataLayout()) {
369 case StoreType::Bits32: { 369 case StoreType::Bits32:
370 u32 shifted_counter = 0;
371 Node value = Immediate(0);
372 for (u32 element = 0; element < 4; ++element) {
373 if (!IsComponentEnabled(comp_mask, element)) {
374 continue;
375 }
376 const auto component_type = GetComponentType(descriptor, element);
377 const auto component_size = GetComponentSize(descriptor.format, element);
378 bool is_signed = true;
379 MetaImage meta{image, {}, element};
380
381 Node converted_value = GetComponentValue(
382 component_type, component_size,
383 Operation(OperationCode::ImageLoad, meta, GetCoordinates(type)),
384 &is_signed);
385
386 // shift element to correct position
387 const auto shifted = shifted_counter;
388 if (shifted > 0) {
389 converted_value =
390 SignedOperation(OperationCode::ILogicalShiftLeft, is_signed,
391 std::move(converted_value), Immediate(shifted));
392 }
393 shifted_counter += component_size;
394
395 // add value into result
396 value = Operation(OperationCode::UBitwiseOr, value, std::move(converted_value));
397 }
398 SetRegister(bb, instr.gpr0.Value(), std::move(value));
399 break;
400 }
401 case StoreType::Bits64: { 370 case StoreType::Bits64: {
402 u32 indexer = 0; 371 u32 indexer = 0;
403 u32 shifted_counter = 0; 372 u32 shifted_counter = 0;
@@ -432,12 +401,6 @@ u32 ShaderIR::DecodeImage(NodeBlock& bb, u32 pc) {
432 // if we shifted enough for 1 byte -> we save it into temp 401 // if we shifted enough for 1 byte -> we save it into temp
433 if (shifted_counter >= 32) { 402 if (shifted_counter >= 32) {
434 SetTemporary(bb, indexer++, std::move(value)); 403 SetTemporary(bb, indexer++, std::move(value));
435
436 // we only use 2 bytes for bits64
437 if (indexer >= 2) {
438 break;
439 }
440
441 // reset counter and value to prepare pack next byte 404 // reset counter and value to prepare pack next byte
442 value = Immediate(0); 405 value = Immediate(0);
443 shifted_counter = 0; 406 shifted_counter = 0;