{"action":"created","comment":{"url":"https://api.github.com/repos/yuzu-emu/yuzu/pulls/comments/243714914","pull_request_review_id":187567204,"id":243714914,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MzcxNDkxNA==","diff_hunk":"@@ -0,0 +1,618 @@\n+// Copyright 2018 yuzu Emulator Project\n+// Licensed under GPLv2 or any later version\n+// Refer to the license.txt file included.\n+\n+#include <algorithm>\n+#include <vector>\n+\n+#include \"common/assert.h\"\n+#include \"common/common_types.h\"\n+#include \"video_core/engines/shader_bytecode.h\"\n+#include \"video_core/shader/shader_ir.h\"\n+\n+namespace VideoCommon::Shader {\n+\n+using Tegra::Shader::Attribute;\n+using Tegra::Shader::Instruction;\n+using Tegra::Shader::OpCode;\n+using Tegra::Shader::Register;\n+using Tegra::Shader::TextureMiscMode;\n+using Tegra::Shader::TextureProcessMode;\n+using Tegra::Shader::TextureType;\n+\n+static std::size_t GetCoordCount(TextureType texture_type) {\n+    switch (texture_type) {\n+    case TextureType::Texture1D:\n+        return 1;\n+    case TextureType::Texture2D:\n+        return 2;\n+    case TextureType::Texture3D:\n+    case TextureType::TextureCube:\n+        return 3;\n+    default:\n+        UNIMPLEMENTED_MSG(\"Unhandled texture type: {}\", static_cast<u32>(texture_type));\n+        return 0;\n+    }\n+}\n+\n+u32 ShaderIR::DecodeMemory(BasicBlock& bb, u32 pc) {\n+    const Instruction instr = {program_code[pc]};\n+    const auto opcode = OpCode::Decode(instr);\n+\n+    switch (opcode->get().GetId()) {\n+    case OpCode::Id::LD_A: {\n+        // Note: Shouldn't this be interp mode flat? As in no interpolation made.\n+        UNIMPLEMENTED_IF_MSG(instr.gpr8.Value() != Register::ZeroIndex,\n+                             \"Indirect attribute loads are not supported\");\n+        UNIMPLEMENTED_IF_MSG((instr.attribute.fmt20.immediate.Value() % sizeof(u32)) != 0,\n+                             \"Unaligned attribute loads are not supported\");\n+\n+        Tegra::Shader::IpaMode input_mode{Tegra::Shader::IpaInterpMode::Perspective,\n+                                          Tegra::Shader::IpaSampleMode::Default};\n+\n+        u64 next_element = instr.attribute.fmt20.element;\n+        auto next_index = static_cast<u64>(instr.attribute.fmt20.index.Value());\n+\n+        const auto LoadNextElement = [&](u32 reg_offset) {\n+            const Node buffer = GetRegister(instr.gpr39);\n+            const Node attribute = GetInputAttribute(static_cast<Attribute::Index>(next_index),\n+                                                     next_element, input_mode, buffer);\n+\n+            SetRegister(bb, instr.gpr0.Value() + reg_offset, attribute);\n+\n+            // Load the next attribute element into the following register. If the element\n+            // to load goes beyond the vec4 size, load the first element of the next\n+            // attribute.\n+            next_element = (next_element + 1) % 4;\n+            next_index = next_index + (next_element == 0 ? 1 : 0);\n+        };\n+\n+        const u32 num_words = static_cast<u32>(instr.attribute.fmt20.size.Value()) + 1;\n+        for (u32 reg_offset = 0; reg_offset < num_words; ++reg_offset) {\n+            LoadNextElement(reg_offset);\n+        }\n+        break;\n+    }\n+    case OpCode::Id::LD_C: {\n+        UNIMPLEMENTED_IF(instr.ld_c.unknown != 0);\n+\n+        Node index = GetRegister(instr.gpr8);\n+\n+        const Node op_a =\n+            GetConstBufferIndirect(instr.cbuf36.index, instr.cbuf36.offset + 0, index);\n+\n+        switch (instr.ld_c.type.Value()) {\n+        case Tegra::Shader::UniformType::Single:\n+            SetRegister(bb, instr.gpr0, op_a);\n+            break;\n+\n+        case Tegra::Shader::UniformType::Double: {\n+            const Node op_b =\n+                GetConstBufferIndirect(instr.cbuf36.index, instr.cbuf36.offset + 4, index);\n+\n+            const Node composite =\n+                Operation(OperationCode::Composite, op_a, op_b, GetRegister(RZ), GetRegister(RZ));\n+\n+            MetaComponents meta{{0, 1, 2, 3}};\n+            bb.push_back(Operation(OperationCode::AssignComposite, meta, composite,\n+                                   GetRegister(instr.gpr0), GetRegister(instr.gpr0.Value() + 1),\n+                                   GetRegister(RZ), GetRegister(RZ)));\n+            break;\n+        }\n+        default:\n+            UNIMPLEMENTED_MSG(\"Unhandled type: {}\", static_cast<unsigned>(instr.ld_c.type.Value()));\n+        }\n+        break;\n+    }\n+    case OpCode::Id::LD_L: {\n+        UNIMPLEMENTED_IF_MSG(instr.ld_l.unknown == 1, \"LD_L Unhandled mode: {}\",\n+                             static_cast<unsigned>(instr.ld_l.unknown.Value()));\n+\n+        const Node index = Operation(OperationCode::IAdd, GetRegister(instr.gpr8),\n+                                     Immediate(static_cast<s32>(instr.smem_imm)));\n+        const Node lmem = GetLocalMemory(index);\n+\n+        switch (instr.ldst_sl.type.Value()) {\n+        case Tegra::Shader::StoreType::Bytes32:\n+            SetRegister(bb, instr.gpr0, lmem);\n+            break;\n+        default:\n+            UNIMPLEMENTED_MSG(\"LD_L Unhandled type: {}\",\n+                              static_cast<unsigned>(instr.ldst_sl.type.Value()));\n+        }\n+        break;\n+    }\n+    case OpCode::Id::ST_A: {\n+        UNIMPLEMENTED_IF_MSG(instr.gpr8.Value() != Register::ZeroIndex,\n+                             \"Indirect attribute loads are not supported\");\n+        UNIMPLEMENTED_IF_MSG((instr.attribute.fmt20.immediate.Value() % sizeof(u32)) != 0,\n+                             \"Unaligned attribute loads are not supported\");\n+\n+        u64 next_element = instr.attribute.fmt20.element;\n+        auto next_index = static_cast<u64>(instr.attribute.fmt20.index.Value());\n+\n+        const auto StoreNextElement = [&](u32 reg_offset) {\n+            const auto dest = GetOutputAttribute(static_cast<Attribute::Index>(next_index),\n+                                                 next_element, GetRegister(instr.gpr39));\n+            const auto src = GetRegister(instr.gpr0.Value() + reg_offset);\n+\n+            bb.push_back(Operation(OperationCode::Assign, dest, src));\n+\n+            // Load the next attribute element into the following register. If the element\n+            // to load goes beyond the vec4 size, load the first element of the next\n+            // attribute.\n+            next_element = (next_element + 1) % 4;\n+            next_index = next_index + (next_element == 0 ? 1 : 0);\n+        };\n+\n+        const u32 num_words = static_cast<u32>(instr.attribute.fmt20.size.Value()) + 1;\n+        for (u32 reg_offset = 0; reg_offset < num_words; ++reg_offset) {\n+            StoreNextElement(reg_offset);\n+        }\n+\n+        break;\n+    }\n+    case OpCode::Id::ST_L: {\n+        // UNIMPLEMENTED_IF_MSG(instr.st_l.unknown == 0, \"ST_L Unhandled mode: {}\",\n+        //                      static_cast<u32>(instr.st_l.unknown.Value()));\n+\n+        const Node index = Operation(OperationCode::IAdd, NO_PRECISE, GetRegister(instr.gpr8),\n+                                     Immediate(static_cast<s32>(instr.smem_imm)));\n+\n+        switch (instr.ldst_sl.type.Value()) {\n+        case Tegra::Shader::StoreType::Bytes32:\n+            SetLocalMemory(bb, index, GetRegister(instr.gpr0));\n+            break;\n+        default:\n+            UNIMPLEMENTED_MSG(\"ST_L Unhandled type: {}\",\n+                              static_cast<u32>(instr.ldst_sl.type.Value()));\n+        }\n+        break;\n+    }\n+    case OpCode::Id::TEX: {\n+        Tegra::Shader::TextureType texture_type{instr.tex.texture_type};\n+        const bool is_array = instr.tex.array != 0;\n+        const bool depth_compare = instr.tex.UsesMiscMode(TextureMiscMode::DC);\n+        const auto process_mode = instr.tex.GetTextureProcessMode();\n+        UNIMPLEMENTED_IF_MSG(instr.tex.UsesMiscMode(TextureMiscMode::AOFFI),\n+                             \"AOFFI is not implemented\");\n+\n+        if (instr.tex.UsesMiscMode(TextureMiscMode::NODEP)) {\n+            LOG_WARNING(HW_GPU, \"TEX.NODEP implementation is incomplete\");\n+        }\n+\n+        const Node texture = GetTexCode(instr, texture_type, process_mode, depth_compare, is_array);\n+\n+        if (depth_compare) {\n+            SetRegister(bb, instr.gpr0, texture);\n+        } else {\n+            MetaComponents meta;\n+            std::array<Node, 4> dest;\n+\n+            std::size_t dest_elem = 0;\n+            for (std::size_t elem = 0; elem < 4; ++elem) {\n+                if (!instr.tex.IsComponentEnabled(elem)) {\n+                    // Skip disabled components\n+                    continue;\n+                }\n+                meta.components_map[dest_elem] = static_cast<u32>(elem);\n+                dest[dest_elem] = GetRegister(instr.gpr0.Value() + dest_elem);\n+\n+                ++dest_elem;\n+            }\n+            std::generate(dest.begin() + dest_elem, dest.end(), [&]() { return GetRegister(RZ); });\n+\n+            bb.push_back(Operation(OperationCode::AssignComposite, std::move(meta), texture,\n+                                   dest[0], dest[1], dest[2], dest[3]));\n+        }\n+        break;\n+    }\n+    case OpCode::Id::TEXS: {\n+        Tegra::Shader::TextureType texture_type{instr.texs.GetTextureType()};\n+        const bool is_array{instr.texs.IsArrayTexture()};\n+        const bool depth_compare = instr.texs.UsesMiscMode(TextureMiscMode::DC);\n+        const auto process_mode = instr.texs.GetTextureProcessMode();\n+\n+        if (instr.texs.UsesMiscMode(TextureMiscMode::NODEP)) {\n+            LOG_WARNING(HW_GPU, \"TEXS.NODEP implementation is incomplete\");\n+        }\n+\n+        const Node texture =\n+            GetTexsCode(instr, texture_type, process_mode, depth_compare, is_array);\n+\n+        if (instr.texs.fp32_flag) {\n+            WriteTexsInstructionFloat(bb, instr, texture);\n+        } else {\n+            UNIMPLEMENTED();\n+            // WriteTexsInstructionHalfFloat(bb, instr, texture);\n+        }\n+        break;\n+    }\n+    case OpCode::Id::TLD4: {\n+        ASSERT(instr.tld4.texture_type == Tegra::Shader::TextureType::Texture2D);","path":"src/video_core/shader/decode/memory.cpp","position":232,"original_position":232,"commit_id":"451357a2607c9a30ae4af65e3d16fad2e01e2a9f","original_commit_id":"451357a2607c9a30ae4af65e3d16fad2e01e2a9f","user":{"login":"heapo","id":45604170,"node_id":"MDQ6VXNlcjQ1NjA0MTcw","avatar_url":"https://avatars0.githubusercontent.com/u/45604170?v=4","gravatar_id":"","url":"https://api.github.com/users/heapo","html_url":"https://github.com/heapo","followers_url":"https://api.github.com/users/heapo/followers","following_url":"https://api.github.com/users/heapo/following{/other_user}","gists_url":"https://api.github.com/users/heapo/gists{/gist_id}","starred_url":"https://api.github.com/users/heapo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/heapo/subscriptions","organizations_url":"https://api.github.com/users/heapo/orgs","repos_url":"https://api.github.com/users/heapo/repos","events_url":"https://api.github.com/users/heapo/events{/privacy}","received_events_url":"https://api.github.com/users/heapo/received_events","type":"User","site_admin":false},"body":"Just left-over debugging code?","created_at":"2018-12-21T23:50:57Z","updated_at":"2018-12-21T23:50:57Z","html_url":"https://github.com/yuzu-emu/yuzu/pull/1927#discussion_r243714914","pull_request_url":"https://api.github.com/repos/yuzu-emu/yuzu/pulls/1927","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/yuzu-emu/yuzu/pulls/comments/243714914"},"html":{"href":"https://github.com/yuzu-emu/yuzu/pull/1927#discussion_r243714914"},"pull_request":{"href":"https://api.github.com/repos/yuzu-emu/yuzu/pulls/1927"}}},"pull_request":{"url":"https://api.github.com/repos/yuzu-emu/yuzu/pulls/1927","id":240379236,"node_id":"MDExOlB1bGxSZXF1ZXN0MjQwMzc5MjM2","html_url":"https://github.com/yuzu-emu/yuzu/pull/1927","diff_url":"https://github.com/yuzu-emu/yuzu/pull/1927.diff","patch_url":"https://github.com/yuzu-emu/yuzu/pull/1927.patch","issue_url":"https://api.github.com/repos/yuzu-emu/yuzu/issues/1927","number":1927,"state":"open","locked":false,"title":"[WIP] video_core: Replace gl_shader_decompiler with an IR based decompiler","user":{"login":"ReinUsesLisp","id":26564870,"node_id":"MDQ6VXNlcjI2NTY0ODcw","avatar_url":"https://avatars3.githubusercontent.com/u/26564870?v=4","gravatar_id":"","url":"https://api.github.com/users/ReinUsesLisp","html_url":"https://github.com/ReinUsesLisp","followers_url":"https://api.github.com/users/ReinUsesLisp/followers","following_url":"https://api.github.com/users/ReinUsesLisp/following{/other_user}","gists_url":"https://api.github.com/users/ReinUsesLisp/gists{/gist_id}","starred_url":"https://api.github.com/users/ReinUsesLisp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ReinUsesLisp/subscriptions","organizations_url":"https://api.github.com/users/ReinUsesLisp/orgs","repos_url":"https://api.github.com/users/ReinUsesLisp/repos","events_url":"https://api.github.com/users/ReinUsesLisp/events{/privacy}","received_events_url":"https://api.github.com/users/ReinUsesLisp/received_events","type":"User","site_admin":false},"body":"This PR aims to solve two issues with one big bullet:\r\n* to have an API agnostic decompiler and\r\n* to be able to do code analysis on shaders (like constant propagation for LDG).\r\n\r\nI know this is a pain to review (as it was also to write), so to split the work here's a check list of reviewed instructions (to ease the track):\r\n\r\n- [ ] MOV\r\n- [ ] FMUL\r\n- [ ] FADD\r\n- [ ] MUFU\r\n- [ ] FMNMX\r\n- [ ] RRO\r\n- [ ] MOV32_IMM\r\n- [ ] FADD32I\r\n- [ ] LD_A\r\n- [ ] ST_A\r\n- [ ] EXIT\r\n- [ ] IPA\r\n- [ ] BRA\r\n- [ ] FSETP\r\n- [ ] TEXS\r\n- [ ] TEX\r\n- [ ] TXQ\r\n- [ ] TMML\r\n- [ ] PSETP\r\n- [ ] SSY and SYNC\r\n- [ ] DEPBAR\r\n- [ ] F2F\r\n- [ ] I2F\r\n- [ ] F2I\r\n- [ ] FSET\r\n- [ ] BFE\r\n- [ ] LOP32I\r\n- [ ] SHR\r\n- [ ] SHL\r\n- [ ] LD_C\r\n- [ ] ISET\r\n- [ ] BFI\r\n- [ ] ISETP\r\n- [ ] IADD\r\n- [ ] SEL\r\n- [ ] LOP\r\n- [ ] PBK and BRK\r\n- [ ] XMAD\r\n- [ ] ISCADD\r\n- [ ] I2I\r\n- [ ] IMNMX\r\n- [ ] MOV_SYS\r\n- [ ] HADD2 and HMUL2 (immediate)\r\n- [ ] HADD and HMUL2\r\n- [ ] HSETP\r\n- [ ] LD_L\r\n- [ ] ST_L\r\n- [ ] LOP3\r\n- [ ] IADD3\r\n- [ ] LEA\r\n\r\nFor this to be in a mergeable state I have to implement the remaining and to have a replacement for #1603. There's also some stuff that's wrong at the moment (like array indexes in textures).","created_at":"2018-12-21T05:57:28Z","updated_at":"2018-12-21T23:50:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"64175dc3bd9033e130807f27bf2d017193f7e93f","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/yuzu-emu/yuzu/pulls/1927/commits","review_comments_url":"https://api.github.com/repos/yuzu-emu/yuzu/pulls/1927/comments","review_comment_url":"https://api.github.com/repos/yuzu-emu/yuzu/pulls/comments{/number}","comments_url":"https://api.github.com/repos/yuzu-emu/yuzu/issues/1927/comments","statuses_url":"https://api.github.com/repos/yuzu-emu/yuzu/statuses/451357a2607c9a30ae4af65e3d16fad2e01e2a9f","head":{"label":"ReinUsesLisp:shader-ir","ref":"shader-ir","sha":"451357a2607c9a30ae4af65e3d16fad2e01e2a9f","user":{"login":"ReinUsesLisp","id":26564870,"node_id":"MDQ6VXNlcjI2NTY0ODcw","avatar_url":"https://avatars3.githubusercontent.com/u/26564870?v=4","gravatar_id":"","url":"https://api.github.com/users/ReinUsesLisp","html_url":"https://github.com/ReinUsesLisp","followers_url":"https://api.github.com/users/ReinUsesLisp/followers","following_url":"https://api.github.com/users/ReinUsesLisp/following{/other_user}","gists_url":"https://api.github.com/users/ReinUsesLisp/gists{/gist_id}","starred_url":"https://api.github.com/users/ReinUsesLisp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ReinUsesLisp/subscriptions","organizations_url":"https://api.github.com/users/ReinUsesLisp/orgs","repos_url":"https://api.github.com/users/ReinUsesLisp/repos","events_url":"https://api.github.com/users/ReinUsesLisp/events{/privacy}","received_events_url":"https://api.github.com/users/ReinUsesLisp/received_events","type":"User","site_admin":false},"repo":{"id":145261022,"node_id":"MDEwOlJlcG9zaXRvcnkxNDUyNjEwMjI=","name":"yuzu","full_name":"ReinUsesLisp/yuzu","private":false,"owner":{"login":"ReinUsesLisp","id":26564870,"node_id":"MDQ6VXNlcjI2NTY0ODcw","avatar_url":"https://avatars3.githubusercontent.com/u/26564870?v=4","gravatar_id":"","url":"https://api.github.com/users/ReinUsesLisp","html_url":"https://github.com/ReinUsesLisp","followers_url":"https://api.github.com/users/ReinUsesLisp/followers","following_url":"https://api.github.com/users/ReinUsesLisp/following{/other_user}","gists_url":"https://api.github.com/users/ReinUsesLisp/gists{/gist_id}","starred_url":"https://api.github.com/users/ReinUsesLisp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ReinUsesLisp/subscriptions","organizations_url":"https://api.github.com/users/ReinUsesLisp/orgs","repos_url":"https://api.github.com/users/ReinUsesLisp/repos","events_url":"https://api.github.com/users/ReinUsesLisp/events{/privacy}","received_events_url":"https://api.github.com/users/ReinUsesLisp/received_events","type":"User","site_admin":false},"html_url":"https://github.com/ReinUsesLisp/yuzu","description":"Nintendo Switch Emulator","fork":true,"url":"https://api.github.com/repos/ReinUsesLisp/yuzu","forks_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/forks","keys_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/teams","hooks_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/hooks","issue_events_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/issues/events{/number}","events_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/events","assignees_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/assignees{/user}","branches_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/branches{/branch}","tags_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/tags","blobs_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/git/refs{/sha}","trees_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/statuses/{sha}","languages_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/languages","stargazers_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/stargazers","contributors_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/contributors","subscribers_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/subscribers","subscription_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/subscription","commits_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/commits{/sha}","git_commits_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/git/commits{/sha}","comments_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/comments{/number}","issue_comment_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/issues/comments{/number}","contents_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/contents/{+path}","compare_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/merges","archive_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/downloads","issues_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/issues{/number}","pulls_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/pulls{/number}","milestones_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/milestones{/number}","notifications_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/labels{/name}","releases_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/releases{/id}","deployments_url":"https://api.github.com/repos/ReinUsesLisp/yuzu/deployments","created_at":"2018-08-19T00:12:35Z","updated_at":"2018-12-02T13:17:44Z","pushed_at":"2018-12-21T22:11:32Z","git_url":"git://github.com/ReinUsesLisp/yuzu.git","ssh_url":"git@github.com:ReinUsesLisp/yuzu.git","clone_url":"https://github.com/ReinUsesLisp/yuzu.git","svn_url":"https://github.com/ReinUsesLisp/yuzu","homepage":"","size":27347,"stargazers_count":2,"watchers_count":2,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0","node_id":"MDc6TGljZW5zZTg="},"forks":0,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"yuzu-emu:master","ref":"master","sha":"e75e8b9580581d1258154d51ac03893386a500e5","user":{"login":"yuzu-emu","id":35075882,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM1MDc1ODgy","avatar_url":"https://avatars1.githubusercontent.com/u/35075882?v=4","gravatar_id":"","url":"https://api.github.com/users/yuzu-emu","html_url":"https://github.com/yuzu-emu","followers_url":"https://api.github.com/users/yuzu-emu/followers","following_url":"https://api.github.com/users/yuzu-emu/following{/other_user}","gists_url":"https://api.github.com/users/yuzu-emu/gists{/gist_id}","starred_url":"https://api.github.com/users/yuzu-emu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yuzu-emu/subscriptions","organizations_url":"https://api.github.com/users/yuzu-emu/orgs","repos_url":"https://api.github.com/users/yuzu-emu/repos","events_url":"https://api.github.com/users/yuzu-emu/events{/privacy}","received_events_url":"https://api.github.com/users/yuzu-emu/received_events","type":"Organization","site_admin":false},"repo":{"id":116167731,"node_id":"MDEwOlJlcG9zaXRvcnkxMTYxNjc3MzE=","name":"yuzu","full_name":"yuzu-emu/yuzu","private":false,"owner":{"login":"yuzu-emu","id":35075882,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM1MDc1ODgy","avatar_url":"https://avatars1.githubusercontent.com/u/35075882?v=4","gravatar_id":"","url":"https://api.github.com/users/yuzu-emu","html_url":"https://github.com/yuzu-emu","followers_url":"https://api.github.com/users/yuzu-emu/followers","following_url":"https://api.github.com/users/yuzu-emu/following{/other_user}","gists_url":"https://api.github.com/users/yuzu-emu/gists{/gist_id}","starred_url":"https://api.github.com/users/yuzu-emu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yuzu-emu/subscriptions","organizations_url":"https://api.github.com/users/yuzu-emu/orgs","repos_url":"https://api.github.com/users/yuzu-emu/repos","events_url":"https://api.github.com/users/yuzu-emu/events{/privacy}","received_events_url":"https://api.github.com/users/yuzu-emu/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/yuzu-emu/yuzu","description":"Nintendo Switch Emulator","fork":false,"url":"https://api.github.com/repos/yuzu-emu/yuzu","forks_url":"https://api.github.com/repos/yuzu-emu/yuzu/forks","keys_url":"https://api.github.com/repos/yuzu-emu/yuzu/keys{/key_id}","collaborators_url":"https://api.github.com/repos/yuzu-emu/yuzu/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/yuzu-emu/yuzu/teams","hooks_url":"https://api.github.com/repos/yuzu-emu/yuzu/hooks","issue_events_url":"https://api.github.com/repos/yuzu-emu/yuzu/issues/events{/number}","events_url":"https://api.github.com/repos/yuzu-emu/yuzu/events","assignees_url":"https://api.github.com/repos/yuzu-emu/yuzu/assignees{/user}","branches_url":"https://api.github.com/repos/yuzu-emu/yuzu/branches{/branch}","tags_url":"https://api.github.com/repos/yuzu-emu/yuzu/tags","blobs_url":"https://api.github.com/repos/yuzu-emu/yuzu/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/yuzu-emu/yuzu/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/yuzu-emu/yuzu/git/refs{/sha}","trees_url":"https://api.github.com/repos/yuzu-emu/yuzu/git/trees{/sha}","statuses_url":"https://api.github.com/repos/yuzu-emu/yuzu/statuses/{sha}","languages_url":"https://api.github.com/repos/yuzu-emu/yuzu/languages","stargazers_url":"https://api.github.com/repos/yuzu-emu/yuzu/stargazers","contributors_url":"https://api.github.com/repos/yuzu-emu/yuzu/contributors","subscribers_url":"https://api.github.com/repos/yuzu-emu/yuzu/subscribers","subscription_url":"https://api.github.com/repos/yuzu-emu/yuzu/subscription","commits_url":"https://api.github.com/repos/yuzu-emu/yuzu/commits{/sha}","git_commits_url":"https://api.github.com/repos/yuzu-emu/yuzu/git/commits{/sha}","comments_url":"https://api.github.com/repos/yuzu-emu/yuzu/comments{/number}","issue_comment_url":"https://api.github.com/repos/yuzu-emu/yuzu/issues/comments{/number}","contents_url":"https://api.github.com/repos/yuzu-emu/yuzu/contents/{+path}","compare_url":"https://api.github.com/repos/yuzu-emu/yuzu/compare/{base}...{head}","merges_url":"https://api.github.com/repos/yuzu-emu/yuzu/merges","archive_url":"https://api.github.com/repos/yuzu-emu/yuzu/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/yuzu-emu/yuzu/downloads","issues_url":"https://api.github.com/repos/yuzu-emu/yuzu/issues{/number}","pulls_url":"https://api.github.com/repos/yuzu-emu/yuzu/pulls{/number}","milestones_url":"https://api.github.com/repos/yuzu-emu/yuzu/milestones{/number}","notifications_url":"https://api.github.com/repos/yuzu-emu/yuzu/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/yuzu-emu/yuzu/labels{/name}","releases_url":"https://api.github.com/repos/yuzu-emu/yuzu/releases{/id}","deployments_url":"https://api.github.com/repos/yuzu-emu/yuzu/deployments","created_at":"2018-01-03T18:13:57Z","updated_at":"2018-12-21T21:17:29Z","pushed_at":"2018-12-21T22:11:34Z","git_url":"git://github.com/yuzu-emu/yuzu.git","ssh_url":"git@github.com:yuzu-emu/yuzu.git","clone_url":"https://github.com/yuzu-emu/yuzu.git","svn_url":"https://github.com/yuzu-emu/yuzu","homepage":"","size":26900,"stargazers_count":5973,"watchers_count":5973,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":373,"mirror_url":null,"archived":false,"open_issues_count":79,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0","node_id":"MDc6TGljZW5zZTg="},"forks":373,"open_issues":79,"watchers":5973,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/yuzu-emu/yuzu/pulls/1927"},"html":{"href":"https://github.com/yuzu-emu/yuzu/pull/1927"},"issue":{"href":"https://api.github.com/repos/yuzu-emu/yuzu/issues/1927"},"comments":{"href":"https://api.github.com/repos/yuzu-emu/yuzu/issues/1927/comments"},"review_comments":{"href":"https://api.github.com/repos/yuzu-emu/yuzu/pulls/1927/comments"},"review_comment":{"href":"https://api.github.com/repos/yuzu-emu/yuzu/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/yuzu-emu/yuzu/pulls/1927/commits"},"statuses":{"href":"https://api.github.com/repos/yuzu-emu/yuzu/statuses/451357a2607c9a30ae4af65e3d16fad2e01e2a9f"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"heapo"}}