summaryrefslogtreecommitdiffstats
path: root/src/video_core/shader/shader_ir.h (unfollow)
Commit message (Collapse)AuthorFilesLines
2019-12-10shader: Keep track of shaders using warp instructionsReinUsesLisp1-0/+5
2019-11-23shader/texture: Deduce texture buffers from lockerReinUsesLisp1-4/+9
Instead of specializing shaders to separate texture buffers from 1D textures, use the locker to deduce them while they are being decoded.
2019-11-08video_core: Silence implicit conversion warningsReinUsesLisp1-3/+3
2019-10-31Shader_IR: Fix regression on TLD4Fernando Sahmkow1-1/+1
Originally on the last commit I thought TLD4 acted the same as TLD4S and didn't have a mask. It actually does have a component mask. This commit corrects that.
2019-10-30Shader_IR: Fix TLD4 and add Bindless Variant.Fernando Sahmkow1-2/+2
This commit fixes an issue where not all 4 results of tld4 were being written, the color component was defaulted to red, among other things. It also implements the bindless variant.
2019-10-30shader/node: Unpack bindless texture encodingReinUsesLisp1-7/+5
Bindless textures were using u64 to pack the buffer and offset from where they come from. Drop this in favor of separated entries in the struct. Remove the usage of std::set in favor of std::list (it's not std::vector to avoid reference invalidations) for samplers and images.
2019-10-25gl_shader_decompiler: Move entries to a separate functionReinUsesLisp1-6/+6
2019-10-25Shader_IR: allow lookup of texture samplers within the shader_ir for instructions that don't provide itFernando Sahmkow1-3/+9
2019-10-25Shader_Cache: setup connection of ConstBufferLockerFernando Sahmkow1-1/+2
2019-10-25VideoCore: Unify const buffer accessing along engines and provide ConstBufferLocker class to shaders.Fernando Sahmkow1-0/+1
2019-10-22Shader_Ir: Fix TLD4S from using a component mask.Fernando Sahmkow1-1/+1
TLD4S always outputs 4 values, the previous code checked a component mask and omitted those values that weren't part of it. This commit corrects that and makes sure all 4 values are set.
2019-10-22shader_ir/memory: Ignore global memory when tracking failsReinUsesLisp1-2/+3
Ignore global memory operations instead of invoking undefined behaviour when constant buffer tracking fails and we are blasting through asserts, ignore the operation. In the case of LDG this means filling the destination registers with zeroes; for STG this means ignore the instruction as a whole. The default behaviour is still to abort execution on failure.
2019-10-05vk_shader_compiler: Implement the decompiler in SPIR-VFernando Sahmkow1-0/+4
2019-10-05Shader_Ir: Refactor Decompilation process and allow multiple decompilation modes.Fernando Sahmkow1-1/+9
2019-10-05gl_shader_decompiler: Implement AST decompilingFernando Sahmkow1-8/+17
2019-10-05shader_ir: Declare Manager and pass it to appropiate programs.Fernando Sahmkow1-0/+2
2019-09-21gl_shader_decompiler: Use uint for images and fix SUATOMReinUsesLisp1-6/+3
In the process remove implementation of SUATOM.MIN and SUATOM.MAX as these require a distinction between U32 and S32. These have to be implemented with imageCompSwap loop.
2019-09-19VideoCore: Corrections to the MME Inliner and removal of hacky instance management.Fernando Sahmkow1-0/+10
2019-09-11shader/image: Implement SUATOM and fix SUSTReinUsesLisp1-2/+8
2019-09-06gl_shader_decompiler: Keep track of written images and mark them as modifiedReinUsesLisp1-4/+4
2019-09-05shader_ir: Implement ST_SReinUsesLisp1-1/+5
This instruction writes to a memory buffer shared with threads within the same work group. It is known as "shared" memory in GLSL.
2019-08-21shader_ir: Implement VOTEReinUsesLisp1-0/+1
Implement VOTE using Nvidia's intrinsics. Documentation about these can be found here https://developer.nvidia.com/reading-between-threads-shader-intrinsics Instead of using portable ARB instructions I opted to use Nvidia intrinsics because these are the closest we have to how Tegra X1 hardware renders. To stub VOTE on non-Nvidia drivers (including nouveau) this commit simulates a GPU with a warp size of one, returning what is meaningful for the instruction being emulated: * anyThreadNV(value) -> value * allThreadsNV(value) -> value * allThreadsEqualNV(value) -> true ballotARB, also known as "uint64_t(activeThreadsNV())", emits VOTE.ANY Rd, PT, PT; on nouveau's compiler. This doesn't match exactly to Nvidia's code VOTE.ALL Rd, PT, PT; Which is emulated with activeThreadsNV() by this commit. In theory this shouldn't really matter since .ANY, .ALL and .EQ affect the predicates (set to PT on those cases) and not the registers.
2019-07-22shader/decode: Implement S2R TicReinUsesLisp1-0/+3
2019-07-17shader_ir: Rename Get/SetTemporal to Get/SetTemporaryLioncash1-4/+4
This is more accurate in terms of describing what the functions are actually doing. Temporal relates to time, not the setting of a temporary itself.
2019-07-17shader_ir: Remove unused includesLioncash1-3/+0
Removes unnecessary header dependencies.
2019-07-15shader: Allow tracking of indirect buffers without variable offsetReinUsesLisp1-1/+1
While changing this code, simplify tracking code to allow returning the base address node, this way callers don't have to manually rebuild it on each invocation.
2019-07-09shader_ir: Add comments on missing instruction.Fernando Sahmkow1-0/+4
Also shows Nvidia's address space on comments.
2019-07-09shader_ir: Unify blocks in decompiled shaders.Fernando Sahmkow1-0/+6
2019-07-09shader_ir: Decompile Flow StackFernando Sahmkow1-0/+3
2019-07-09shader_ir: propagate shader size to the IRFernando Sahmkow1-1/+2
2019-07-09shader_ir: Remove the old scanner.Fernando Sahmkow1-11/+0
2019-07-08gl_shader_decompiler: Implement gl_ViewportIndex and gl_Layer in vertex shadersReinUsesLisp1-0/+15
This commit implements gl_ViewportIndex and gl_Layer in vertex and geometry shaders. In the case it's used in a vertex shader, it requires ARB_shader_viewport_layer_array. This extension is available on AMD and Nvidia devices (mesa and proprietary drivers), but not available on Intel on any platform. At the moment of writing this description I don't know if this is a hardware limitation or a driver limitation. In the case that ARB_shader_viewport_layer_array is not available, writes to these registers on a vertex shader are ignored, with the appropriate logging.
2019-06-21shader: Implement bindless imagesReinUsesLisp1-0/+3
2019-06-21shader: Decode SUST and implement backing image functionalityReinUsesLisp1-0/+9
2019-06-21shader: Implement texture buffersReinUsesLisp1-0/+2
2019-06-07shader: Move Node declarations out of the shader IR headerReinUsesLisp1-492/+1
Analysis passes do not have a good reason to depend on shader_ir.h to work on top of nodes. This splits node-related declarations to their own file and leaves the IR in shader_ir.h
2019-06-06shader: Use shared_ptr to store nodes and move initialization to fileReinUsesLisp1-83/+25
Instead of having a vector of unique_ptr stored in a vector and returning star pointers to this, use shared_ptr. While changing initialization code, move it to a separate file when possible. This is a first step to allow code analysis and node generation beyond the ShaderIR class.
2019-05-23shader/shader_ir: Make Comment() take a std::string by valueLioncash1-1/+1
This allows for forming comment nodes without making unnecessary copies of the std::string instance. e.g. previously: Comment(fmt::format("Base address is c[0x{:x}][0x{:x}]", cbuf->GetIndex(), cbuf_offset)); Would result in a copy of the string being created, as CommentNode() takes a std::string by value (a const ref passed to a value parameter results in a copy). Now, only one instance of the string is ever moved around. (fmt::format returns a std::string, and since it's returned from a function by value, this is a prvalue (which can be treated like an rvalue), so it's moved into Comment's string parameter), we then move it into the CommentNode constructor, which then moves the string into its member variable).
2019-05-21shader/memory: Implement LD (generic memory)ReinUsesLisp1-4/+2
2019-05-20shader: Implement S2R Tid{XYZ} and CtaId{XYZ}ReinUsesLisp1-1/+7
2019-05-19shader/shader_ir: Remove unnecessary inline specifiersLioncash1-2/+2
constexpr internally links by default, so the inline specifier is unnecessary.
2019-05-19shader/shader_ir: Simplify constructors for OperationNodeLioncash1-15/+6
Many of these constructors don't even need to be templated. The only ones that need to be templated are the ones that actually make use of the parameter pack. Even then, since std::vector accepts an initializer list, we can supply the parameter pack directly to it instead of creating our own copy of the list, then copying it again into the std::vector.
2019-05-19shader/shader_ir: Remove unnecessary template parameter packs from Operation() overloads where applicableLioncash1-2/+0
These overloads don't actually make use of the parameter pack, so they can be turned into regular non-template function overloads.
2019-05-19shader/shader_ir: Mark tracking functions as const member functionsLioncash1-3/+4
These don't actually modify instance state, so they can be marked as const member functions
2019-05-19shader/shader_ir: Place implementations of constructor and destructor in cpp fileLioncash1-5/+2
Given the class contains quite a lot of non-trivial types, place the constructor and destructor within the cpp file to avoid inlining construction and destruction code everywhere the class is used.
2019-05-03shader: Add physical attributes commentariesReinUsesLisp1-2/+4
2019-05-03gl_shader_decompiler: Implement GLSL physical attributesReinUsesLisp1-1/+1
2019-05-03shader_ir/memory: Implement physical input attributesReinUsesLisp1-3/+17
2019-05-03shader: Remove unused AbufNode Ipa modeReinUsesLisp1-16/+4
2019-05-03shader_ir/memory: Emit AL2P IRReinUsesLisp1-0/+5
2019-04-26shader_ir: Move Sampler index entry in operand< to sort declarationsReinUsesLisp1-2/+2
2019-04-26shader_ir: Add missing entry to Sampler operand< comparisonReinUsesLisp1-2/+3
2019-04-16shader_ir/decode: Fix half float pre-operations and remove MetaHalfArithmeticReinUsesLisp1-16/+10
Operations done before the main half float operation (like HAdd) were managing a packed value instead of the unpacked one. Adding an unpacked operation allows us to drop the per-operand MetaHalfArithmetic entry, simplifying the code overall.
2019-04-16shader_ir/decode: Implement half float saturationReinUsesLisp1-0/+3
2019-04-16renderer_opengl: Implement half float NaN comparisonsReinUsesLisp1-6/+12
2019-04-14shader_ir: Implement STG, keep track of global memory usage and flushReinUsesLisp1-3/+13
2019-04-08Move ConstBufferAccessor to Maxwell3d, correct mistakes and clang format.Fernando Sahmkow1-2/+2
2019-04-08Refactor GetTextureCode and GetTexCode to use an optional instead of optional parametersFernando Sahmkow1-11/+9
2019-04-08Implement Bindless Handling on SetupTextureFernando Sahmkow1-4/+3
2019-04-08Unify both sampler types.Fernando Sahmkow1-8/+28
2019-04-08Implement Bindless Samplers and TEX_B in the IR.Fernando Sahmkow1-9/+22
2019-03-30shader_ir/decode: Implement AOFFI for TEX and TLD4ReinUsesLisp1-3/+6
2019-03-30shader_ir: Implement immediate register trackingReinUsesLisp1-0/+3
2019-02-26shader/decode: Remove extras from MetaTextureReinUsesLisp1-1/+3
2019-02-26shader/decode: Split memory and texture instructions decodingReinUsesLisp1-0/+1
2019-02-07shader_ir: Remove F4 prefix to texture operationsReinUsesLisp1-6/+6
This was originally included because texture operations returned a vec4. These operations now return a single float and the F4 prefix doesn't mean anything.
2019-02-07shader_ir: Clean texture management codeReinUsesLisp1-5/+5
Previous code relied on GLSL parameter order (something that's always ill-formed on an IR design). This approach passes spatial coordiantes through operation nodes and array and depth compare values in the the texture metadata. It still contains an "extra" vector containing generic nodes for bias and component index (for example) which is still a bit ill-formed but it should be better than the previous approach.
2019-02-07gl_shader_disk_cache: Save GLSL and entries into the precompiled fileReinUsesLisp1-0/+9
2019-02-03shader_ir: Rename BasicBlock to NodeBlockReinUsesLisp1-46/+46
It's not always used as a basic block. Rename it for consistency.
2019-02-03shader_ir: Pass decoded nodes as a whole instead of per basic blocksReinUsesLisp1-25/+26
Some games call LDG at the top of a basic block, making the tracking heuristic to fail. This commit lets the heuristic the decoded nodes as a whole instead of per basic blocks. This may lead to some false positives but allows it the heuristic to track cases it previously couldn't.
2019-01-30shader_ir: Unify constant buffer offset valuesReinUsesLisp1-1/+1
Constant buffer values on the shader IR were using different offsets if the access direct or indirect. cbuf34 has a non-multiplied offset while cbuf36 does. On shader decoding this commit multiplies it by four on cbuf34 queries.
2019-01-30shader_decode: Implement LDG and basic cbuf trackingReinUsesLisp1-4/+34
2019-01-28shader/shader_ir: Amend three comment typosLioncash1-3/+3
Given we're in the area, these are three trivial typos that can be corrected.
2019-01-28shader/shader_ir: Amend constructor initializer ordering for AbufNodeLioncash1-2/+2
Orders the class members in the same order that they would actually be initialized in. Gets rid of two compiler warnings.
2019-01-15shader_ir: Pass to decoder functions basic block's codeReinUsesLisp1-25/+25
2019-01-15shader_decode: Improve zero flag implementationReinUsesLisp1-2/+7
2019-01-15shader_ir: Remove composite primitives and use temporals insteadReinUsesLisp1-30/+30
2019-01-15shader_decode: Use proper primitive namesReinUsesLisp1-7/+5
2019-01-15shader_decode: Use BitfieldExtract instead of shift + andReinUsesLisp1-2/+7
2019-01-15shader_ir: Remove Ipa primitiveReinUsesLisp1-2/+0
2019-01-15shader_ir: Remove RZ and use Register::ZeroIndex insteadReinUsesLisp1-2/+0
2019-01-15shader_decode: Implement TEXS.F16ReinUsesLisp1-2/+6
2019-01-15video_core: Implement IR based geometry shadersReinUsesLisp1-0/+3
2019-01-15shader_decode: Implement VMAD and VSETPReinUsesLisp1-0/+4
2019-01-15shader_decode: Implement HSET2ReinUsesLisp1-0/+1
2019-01-15shader_decode: Rework HSETP2ReinUsesLisp1-7/+8
2019-01-15shader_decode: Implement HFMA2ReinUsesLisp1-0/+1
2019-01-15shader_decode: Implement POPCReinUsesLisp1-1/+3
2019-01-15shader_decode: Implement TLDS (untested)ReinUsesLisp1-0/+4
2019-01-15shader_decode: Update TLD4 reflecting #1862 changesReinUsesLisp1-0/+3
2019-01-15shader_ir: Fixup TEX and TEXS and partially fix TLD4 decompilingReinUsesLisp1-1/+3
2019-01-15video_core: Address feedbackReinUsesLisp1-11/+10
2019-01-15shader_ir: Fixup file inclusions and clang-formatReinUsesLisp1-1/+0
2019-01-15shader_ir: Move comment node stringMat M1-2/+2
Co-Authored-By: ReinUsesLisp <reinuseslisp@airmail.cc>
2019-01-15shader_ir: Address feedback to avoid UB in bit castingReinUsesLisp1-2/+4
2019-01-15shader_decode: Implement LOP3ReinUsesLisp1-0/+2
2019-01-15shader_decode: Implement LOP32IReinUsesLisp1-0/+5
2019-01-15shader_decode: Implement TEX and TXQReinUsesLisp1-0/+4
2019-01-15shader_decode: Implement TEXS (F32)ReinUsesLisp1-0/+18
2019-01-15shader_ir: Add condition code helperReinUsesLisp1-0/+3
2019-01-15shader_ir: Add predicate combiner helperReinUsesLisp1-0/+3
2019-01-15shader_ir: Add comparison helpersReinUsesLisp1-0/+9
2019-01-15shader_ir: Add half float helpersReinUsesLisp1-0/+7
2019-01-15shader_ir: Add integer helpersReinUsesLisp1-0/+5
2019-01-15shader_ir: Add float helpersReinUsesLisp1-0/+5
2019-01-15shader_ir: Add settersReinUsesLisp1-0/+8
2019-01-15shader_ir: Add local memory gettersReinUsesLisp1-0/+3
2019-01-15shader_ir: Add internal flag gettersReinUsesLisp1-0/+2
2019-01-15shader_ir: Add attribute gettersReinUsesLisp1-0/+5
2019-01-15shader_ir: Add constant buffer gettersReinUsesLisp1-0/+4
2019-01-15shader_ir: Add register getterReinUsesLisp1-0/+2
2019-01-15shader_ir: Add immediate node constructorsReinUsesLisp1-1/+18
2019-01-15shader_ir: Initial implementationReinUsesLisp1-0/+662