summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_vulkan/vk_rasterizer.cpp (follow)
Commit message (Collapse)AuthorAgeFilesLines
* vk_graphics_pipeline: Manage primitive topology as fixed stateReinUsesLisp2020-10-131-11/+0
| | | | | | | | | Vulkan has requirements for primitive topologies that don't play nicely with yuzu's. Since it's only 4 bits, we can move it to fixed state without changing the size of the pipeline key. - Fixes a regression on recent Nvidia drivers on Fire Emblem: Three Houses.
* renderer_vulkan: Make unconditional use of VK_KHR_timeline_semaphoreReinUsesLisp2020-09-191-11/+8
| | | | | | | | | | | | | | | | | | | | | | | This reworks how host<->device synchronization works on the Vulkan backend. Instead of "protecting" resources with a fence and signalling these as free when the fence is known to be signalled by the host GPU, use timeline semaphores. Vulkan timeline semaphores allow use to work on a subset of D3D12 fences. As far as we are concerned, timeline semaphores are a value set by the host or the device that can be waited by either of them. Taking advantange of this, we can have a monolithically increasing atomic value for each submission to the graphics queue. Instead of protecting resources with a fence, we simply store the current logical tick (the atomic value stored in CPU memory). When we want to know if a resource is free, it can be compared to the current GPU tick. This greatly simplifies resource management code and the free status of resources should have less false negatives. To workaround bugs in validation layers, when these are attached there's a thread waiting for timeline semaphores.
* video_core: Remove all Core::System references in rendererReinUsesLisp2020-09-061-75/+53
| | | | | | | | | Now that the GPU is initialized when video backends are initialized, it's no longer needed to query components once the game is running: it can be done when yuzu is booting. This allows us to pass components between constructors and in the process remove all Core::System references in the video backend.
* vk_state_tracker: Fix primitive topologyReinUsesLisp2020-08-211-2/+2
| | | | | | | | | State track the current primitive topology with a regular comparison instead of using dirty flags. This fixes a bug in dirty flags for this particular state and it also avoids unnecessary state changes as this property is stored in a frequently changed bit field.
* move thread 1/4 count computation into allocate workers methodameerj2020-08-161-11/+1
|
* Address feedback, add shader compile notifier, update setting textameerj2020-08-161-12/+7
|
* Address feedback. Bruteforce delete duplicatesameerj2020-08-161-8/+10
|
* Vk Async pipeline compilationameerj2020-08-161-2/+25
|
* vulkan: Silence more -Wmissing-field-initializer warningsLioncash2020-08-031-2/+7
|
* vk_rasterizer: Remove unused variable in Clear()Lioncash2020-07-211-4/+0
| | | | | The relevant values are already assigned further down in the lambda, so this can be removed entirely.
* vk_rasterizer: Make use of designated initializers where applicableLioncash2020-07-171-41/+47
|
* vk_rasterizer: Pass <pSizes> to CmdBindVertexBuffers2EXTReinUsesLisp2020-07-101-6/+6
| | | | | This has been fixed in Nvidia's public beta driver 451.74. The previous beta driver will be broken, people using these will have to update.
* vk_rasterizer: Use nullptr for <pSizes> in CmdBindVertexBuffers2EXTReinUsesLisp2020-06-271-6/+6
| | | | Disable this temporarily.
* vk_pipeline_cache: Avoid hashing and comparing dynamic state when possibleReinUsesLisp2020-06-271-1/+1
| | | | | | With extended dynamic states, some bytes don't have to be collected from the pipeline key, hence we can avoid hashing and comparing them on lookups.
* vk_rasterizer: Use VK_EXT_extended_dynamic_stateReinUsesLisp2020-06-271-44/+210
|
* fixed_pipeline_state: Add requirements for VK_EXT_extended_dynamic_stateReinUsesLisp2020-06-271-18/+2
| | | | | | | This moves dynamic state present in VK_EXT_extended_dynamic_state to a separate structure in FixedPipelineState. This is structure is at the bottom allowing us to hash and memcmp only when the extension is not supported.
* Merge pull request #4111 from ReinUsesLisp/preserve-contents-vkbunnei2020-06-271-6/+54
|\ | | | | vk_rasterizer: Don't preserve contents on full screen clears
| * vk_rasterizer: Don't preserve contents on full screen clearsReinUsesLisp2020-06-181-6/+54
| | | | | | | | | | | | There's no need to load contents from the CPU when a clear resets all the contents of the underlying memory. This is already implemented on OpenGL and the texture cache.
* | gl_buffer_cache: Mark buffers as residentReinUsesLisp2020-06-241-14/+17
| | | | | | | | | | | | Make stream buffer and cached buffers as resident and query their address. This allows us to use GPU addresses for several proprietary Nvidia extensions.
* | Merge pull request #4110 from ReinUsesLisp/direct-upload-setsRodrigo Locatti2020-06-221-2/+2
|\ \ | | | | | | vk_update_descriptor: Upload descriptor sets data directly
| * | vk_update_descriptor: Upload descriptor sets data directlyReinUsesLisp2020-06-181-2/+2
| |/ | | | | | | | | Instead of copying to a temporary payload before sending the update task to the worker thread, insert elements to the payload directly.
* / vk_rasterizer: BindTransformFeedbackBuffersEXT accepts a size of type VkDeviceSizeMerryMage2020-06-181-1/+1
|/
* Merge pull request #4049 from ReinUsesLisp/separate-samplersbunnei2020-06-131-0/+11
|\ | | | | shader/texture: Join separate image and sampler pairs offline
| * shader/texture: Join separate image and sampler pairs offlineReinUsesLisp2020-06-051-0/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Games using D3D idioms can join images and samplers when a shader executes, instead of baking them into a combined sampler image. This is also possible on Vulkan. One approach to this solution would be to use separate samplers on Vulkan and leave this unimplemented on OpenGL, but we can't do this because there's no consistent way of determining which constant buffer holds a sampler and which one an image. We could in theory find the first bit and if it's in the TIC area, it's an image; but this falls apart when an image or sampler handle use an index of zero. The used approach is to track for a LOP.OR operation (this is done at an IR level, not at an ISA level), track again the constant buffers used as source and store this pair. Then, outside of shader execution, join the sample and image pair with a bitwise or operation. This approach won't work on games that truly use separate samplers in a meaningful way. For example, pooling textures in a 2D array and determining at runtime what sampler to use. This invalidates OpenGL's disk shader cache :) - Used mostly by D3D ports to Switch
* | Merge pull request #3986 from ReinUsesLisp/shader-cachebunnei2020-06-131-3/+4
|\ \ | | | | | | shader_cache: Implement a generic runtime shader cache
| * | vk_pipeline_cache: Use generic shader cacheReinUsesLisp2020-06-071-3/+4
| | | | | | | | | | | | Trivial port the generic shader cache to Vulkan.
* | | texture_cache: Implement rendering to 3D texturesReinUsesLisp2020-06-081-4/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This allows rendering to 3D textures with more than one slice. Applications are allowed to render to more than one slice of a texture using gl_Layer from a VTG shader. This also requires reworking how 3D texture collisions are handled, for now, this commit allows rendering to slices but not to miplevels. When a render target attempts to write to a mipmap, we fallback to the previous implementation (copying or flushing as needed). - Fixes color correction 3D textures on UE4 games (rainbow effects). - Allows Xenoblade games to render to 3D textures directly.
* | | Merge pull request #4034 from ReinUsesLisp/storage-texelsRodrigo Locatti2020-06-071-10/+38
|\ \ \ | |/ / |/| | vk_rasterizer: Implement storage texels and atomic image operations
| * | vk_rasterizer: Implement storage texelsReinUsesLisp2020-06-021-10/+38
| |/ | | | | | | | | | | This is the equivalent of an image buffer on OpenGL. - Used by Octopath Traveler
* | Merge pull request #4013 from ReinUsesLisp/skip-no-xfbbunnei2020-06-051-0/+7
|\ \ | |/ |/| vk_rasterizer: Skip transform feedbacks when extension is unavailable
| * vk_rasterizer: Skip transform feedbacks when extension is unavailableReinUsesLisp2020-05-291-0/+7
| | | | | | | | | | Avoids calling transform feedback procedures when VK_EXT_transform_feedback is not available.
* | Merge pull request #3930 from ReinUsesLisp/animal-bordersbunnei2020-06-011-5/+1
|\ \ | |/ |/| vk_rasterizer: Implement constant attributes
| * vk_rasterizer: Implement constant attributesReinUsesLisp2020-05-131-1/+1
| | | | | | | | | | | | | | | | | | | | Constant attributes (in OpenGL known disabled attributes) are not supported on Vulkan, even with extensions. To emulate this behavior we return zero on reads from disabled vertex attributes in shader code. This has no caching cost because attribute formats are not dynamic state on Vulkan and we have to store it in the pipeline cache anyway. - Fixes Animal Crossing: New Horizons terrain borders
| * vk_rasterizer: Remove buffer check in attribute selectionReinUsesLisp2020-05-131-4/+0
| | | | | | | | | | | | This was a left over from OpenGL when disabled buffers where not properly emulated. We no longer have to assert this as it is checked in vertex buffer initialization.
* | Merge pull request #3905 from FernandoS27/vulkan-fixbunnei2020-05-241-2/+2
|\ \ | | | | | | Correct a series of crashes and intructions on Async GPU and Vulkan Pipeline
| * | VideoCore: Use SyncGuestMemory mechanism for Shader/Pipeline Cache invalidation.Fernando Sahmkow2020-05-101-2/+2
| |/
* / vk_rasterizer: Match OpenGL's FlushAndInvalidate behaviorReinUsesLisp2020-05-161-1/+3
|/ | | | | Match OpenGL's behavior. This can fix or simplify bisecting issues on Vulkan.
* Merge pull request #3808 from ReinUsesLisp/wait-for-idlebunnei2020-05-031-1/+21
|\ | | | | {maxwell_3d,buffer_cache}: Implement memory barriers using 3D registers
| * {maxwell_3d,buffer_cache}: Implement memory barriers using 3D registersReinUsesLisp2020-04-281-1/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | Drop MemoryBarrier from the buffer cache and use Maxwell3D's register WaitForIdle. To implement this on OpenGL we just call glMemoryBarrier with the necessary bits. Vulkan lacks this synchronization primitive, so we set an event and immediately wait for it. This is not a pretty solution, but it's what Vulkan can do without submitting the current command buffer to the queue (which ends up being more expensive on the CPU).
* | Merge pull request #3732 from lioncash/headerbunnei2020-05-021-2/+0
|\ \ | | | | | | vulkan: Remove unnecessary includes
| * | vulkan: Remove unnecessary includesLioncash2020-04-291-2/+0
| |/ | | | | | | | | | | | | Reduces some header churn and reduces rebuilds when some header internals change. While we're at it we can also resolve a missing include in buffer_cache.
* | Merge pull request #3809 from ReinUsesLisp/empty-indexbunnei2020-05-021-0/+3
|\ \ | | | | | | vk_rasterizer: Skip index buffer setup when vertices are zero
| * | vk_rasterizer: Skip index buffer setup when vertices are zeroReinUsesLisp2020-04-281-0/+3
| |/ | | | | | | | | | | | | | | | | Xenoblade 2 invokes a draw call with zero vertices. This is likely due to indirect drawing (glDrawArraysIndirect). This causes a crash in the staging buffer pool when trying to create a buffer with a size of zero. To workaround this, skip index buffer setup entirely when the number of indices is zero.
* | Merge pull request #3693 from ReinUsesLisp/clean-samplersbunnei2020-05-021-7/+6
|\ \ | | | | | | shader/texture: Support multiple unknown sampler properties
| * | shader_ir: Turn classes into data structuresReinUsesLisp2020-04-231-7/+6
| | |
* | | Merge pull request #3805 from ReinUsesLisp/preserve-contentsbunnei2020-04-301-2/+2
|\ \ \ | |_|/ |/| | texture_cache: Reintroduce preserve_contents accurately
| * | texture_cache: Reintroduce preserve_contents accuratelyReinUsesLisp2020-04-271-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This reverts commit 94b0e2e5dae4e0bd0021ac2d8fe1ff904a93ee69. preserve_contents proved to be a meaningful optimization. This commit reintroduces it but properly implemented on OpenGL. We have to make sure the clear removes all the previous contents of the image. It's not currently implemented on Vulkan because we can do smart things there that's preferred to be introduced in a separate commit.
* | | Merge pull request #3766 from ReinUsesLisp/renderpass-cache-keyFernando Sahmkow2020-04-271-22/+29
|\ \ \ | |/ / |/| | vk_renderpass_cache: Pack renderpass cache key and unify keys
| * | vk_rasterizer: Pack texceptions and color formats on invalid formatsReinUsesLisp2020-04-251-4/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Sometimes for unknown reasons NVN games can bind a render target format of 0. This may be a yuzu bug. With the commits before this the formats were specified without being "packed", assuming all formats and texceptions will be written like in the color_attachments vector. To address this issue, iterate all render targets and pack them as they are valid. This way they will match color_attachments. - Fixes validation errors and graphical issues on Breath of the Wild.
| * | vk_rasterizer: Fix framebuffer creation validation errorsReinUsesLisp2020-04-231-2/+4
| | | | | | | | | | | | Framebuffer creation was ignoring the number of color attachments.
| * | vk_pipeline_cache: Unify pipeline cache keys into a single operationReinUsesLisp2020-04-231-6/+10
| | | | | | | | | | | | | | | This allows us to call Common::CityHash and std::memcmp only once for GraphicsPipelineCacheKey. While we are at it, do the same for compute.
| * | vk_renderpass_cache: Pack renderpass cache key to 12 bytesReinUsesLisp2020-04-231-21/+8
| |/
* | Merge pull request #3753 from ReinUsesLisp/ac-vulkanRodrigo Locatti2020-04-261-6/+36
|\ \ | |/ |/| {gl,vk}_rasterizer: Add lazy default buffer maker and use it for empty buffers
| * vk_rasterizer: Add lazy default buffer maker and use it for empty buffersReinUsesLisp2020-04-221-3/+33
| | | | | | | | | | | | | | | | | | | | Introduce a default buffer getter that lazily constructs an empty buffer. This is intended to match OpenGL's buffer 0. Use this for disabled vertex and uniform buffers. While we are at it, include vertex buffer usages for staging buffers to silence validation errors.
| * gl_rasterizer: Fix buffers without sizeReinUsesLisp2020-04-221-3/+3
| | | | | | | | | | | | | | | | | | | | | | On NVN buffers can be enabled but have no size. According to deko3d and the behavior we see in Animal Crossing: New Horizons these buffers get the special address of 0x1000 and limit themselves to 0xfff. Implement buffers without a size by binding a null buffer to OpenGL without a side. https://github.com/devkitPro/deko3d/blob/1d1930beea093b5a663419e93b0649719a3ca5da/source/maxwell/gpu_3d_vbo.cpp#L62-L63
* | Merge pull request #3677 from FernandoS27/better-syncbunnei2020-04-231-1/+54
|\ \ | | | | | | Introduce Predictive Flushing and Improve ASYNC GPU
| * | Async GPU: Correct flushing behavior to be similar to old async GPU behavior.Fernando Sahmkow2020-04-221-0/+4
| | |
| * | Address Feedback.Fernando Sahmkow2020-04-221-1/+1
| | |
| * | vk_fence_manager: Initial implementationReinUsesLisp2020-04-221-12/+4
| | |
| * | OpenGL: Guarantee writes to Buffers.Fernando Sahmkow2020-04-221-2/+0
| | |
| * | GPU: Implement Flush Requests for Async mode.Fernando Sahmkow2020-04-221-0/+4
| | |
| * | FenceManager: Manage syncpoints and rename fences to semaphores.Fernando Sahmkow2020-04-221-2/+14
| | |
| * | Rasterizer: Document SignalFence & ReleaseFences and setup skeletons on Vulkan.Fernando Sahmkow2020-04-221-0/+25
| | |
| * | ThreadManager: Sync async reads on accurate gpu.Fernando Sahmkow2020-04-221-0/+4
| | |
| * | BufferCache: Implement OnCPUWrite and SyncGuestHostFernando Sahmkow2020-04-221-2/+2
| | |
| * | GPU: Refactor synchronization on Async GPUFernando Sahmkow2020-04-221-0/+14
| |/
* | Merge pull request #3653 from ReinUsesLisp/nsight-aftermathFernando Sahmkow2020-04-221-10/+0
|\ \ | |/ |/| renderer_vulkan: Integrate Nvidia Nsight Aftermath on Windows
| * renderer_vulkan: Remove Nvidia checkpointsReinUsesLisp2020-04-131-10/+0
| |
* | Merge pull request #3718 from ReinUsesLisp/better-pipeline-stateRodrigo Locatti2020-04-211-10/+10
|\ \ | | | | | | fixed_pipeline_state: Pack structure, use memcmp and CityHash on it
| * | fixed_pipeline_state: Pack attribute stateReinUsesLisp2020-04-191-10/+10
| | | | | | | | | | | | Reduce FixedPipelineState's size from 1384 to 664 bytes
* | | Initialize quad_indexed_pass before uint8_passAmit Prakash Ambasta2020-04-201-1/+1
| | | | | | | | | Fixes Werror=reorder in gcc
* | | vk_compute_pass: Implement indexed quadsReinUsesLisp2020-04-171-4/+13
|/ / | | | | | | | | | | | | | | | | | | | | | | | | Implement indexed quads (GL_QUADS used with glDrawElements*) with a compute pass conversion. The compute shader converts from uint8/uint16/uint32 indices to uint32. The format is passed through push constants to avoid having different variants of the same shader. - Used by Fast RMX - Used by Xenoblade Chronicles 2 (it still has graphical due to synchronization issues on Vulkan)
* | Merge pull request #3600 from ReinUsesLisp/no-pointer-buf-cacheFernando Sahmkow2020-04-171-17/+13
|\ \ | | | | | | buffer_cache: Return handles instead of pointer to handles
| * | buffer_cache: Return handles instead of pointer to handlesReinUsesLisp2020-04-161-17/+13
| |/ | | | | | | | | | | | | | | | | | | | | The original idea of returning pointers is that handles can be moved. The problem is that the implementation didn't take that in mind and made everything harder to work with. This commit drops pointer to handles and returns the handles themselves. While it is still true that handles can be invalidated, this way we get an old handle instead of a dangling pointer. This problem can be solved in the future with sparse buffers.
* / vk_rasterizer: Default to 1 viewports with a size of 0ReinUsesLisp2020-04-141-3/+6
|/ | | | Silence validation layer errors.
* Merge pull request #3636 from ReinUsesLisp/drop-vk-hppRodrigo Locatti2020-04-131-138/+147
|\ | | | | renderer_vulkan: Drop Vulkan-Hpp
| * renderer_vulkan: Drop Vulkan-HppReinUsesLisp2020-04-111-138/+147
| |
* | texture_cache: Remove preserve_contentsReinUsesLisp2020-04-111-2/+2
|/ | | | | | | preserve_contents was always true. We can't assume we don't have to preserve clears because scissored and color masked clears exist. This removes preserve_contents and assumes it as true at all times.
* VkRasterizer: Eliminate Legacy code.Fernando Sahmkow2020-04-091-1/+0
|
* Memory: Address Feedback.Fernando Sahmkow2020-04-081-2/+2
|
* Shader/Pipeline Cache: Use VAddr instead of physical memory for addressing.Fernando Sahmkow2020-04-061-2/+1
|
* Query Cache: Use VAddr instead of physical memory for adressing.Fernando Sahmkow2020-04-061-2/+2
|
* Buffer Cache: Use vAddr instead of physical memory.Fernando Sahmkow2020-04-061-2/+2
|
* Texture Cache: Use vAddr instead of physical memory for caching.Fernando Sahmkow2020-04-061-4/+3
|
* GPU: Setup Flush/Invalidate to use VAddr instead of CacheAddrFernando Sahmkow2020-04-061-10/+18
|
* vk_rasterizer: Remove unused variableReinUsesLisp2020-03-191-2/+0
|
* Merge pull request #3518 from ReinUsesLisp/scissor-clearsMat M2020-03-171-40/+46
|\ | | | | vk_rasterizer: Implement scissor clears and layered clears
| * vk_rasterizer: Implement layered clearsReinUsesLisp2020-03-151-2/+2
| |
| * vk_rasterizer: Reimplement clears with vkCmdClearAttachmentsReinUsesLisp2020-03-151-40/+46
| |
* | vk_rasterizer: Fix vertex range assertReinUsesLisp2020-03-151-1/+1
|/ | | | | End can be equal to start in CalculateVertexArraysSize. This is quite common when the vertex size is zero.
* vk_rasterizer: Implement transform feedback binding zeroReinUsesLisp2020-03-131-0/+42
|
* Merge pull request #3483 from namkazt/patch-1Fernando Sahmkow2020-03-131-1/+1
|\ | | | | vk_rasterizer: fix mistype on SetupGraphicsImages
| * vk_reasterizer: fix mistype on SetupGraphicsImagesNguyen Dac Nam2020-03-081-1/+1
| | | | | | This should use Maxwell3D engine. Fixed some GPU error on Kirby and maybe other games.
* | Merge pull request #3480 from ReinUsesLisp/vk-disabled-uboFernando Sahmkow2020-03-131-0/+7
|\ \ | | | | | | vk_rasterizer: Support disabled uniform buffers
| * | vk_rasterizer: Support disabled uniform buffersReinUsesLisp2020-03-061-0/+7
| |/
* | Merge pull request #3301 from ReinUsesLisp/state-trackerRodrigo Locatti2020-03-091-37/+32
|\ \ | |/ |/| video_core: Remove gl_state and use a state tracker based on dirty flags
| * vk_rasterizer: Pass Maxwell registers to dynamic updatesReinUsesLisp2020-02-281-20/+15
| |
| * vk_state_tracker: Implement dirty flags for stencil propertiesReinUsesLisp2020-02-281-0/+3
| |
| * vk_state_tracker: Implement dirty flags for depth boundsReinUsesLisp2020-02-281-0/+3
| |
| * vk_state_tracker: Implement dirty flags for blend constantsReinUsesLisp2020-02-281-0/+3
| |
| * vk_state_tracker: Implement dirty flags for depth biasReinUsesLisp2020-02-281-0/+3
| |
| * vk_state_tracker: Implement dirty flags for scissorsReinUsesLisp2020-02-281-0/+3
| |
| * vk_state_tracker: Initial implementationReinUsesLisp2020-02-281-3/+14
| | | | | | | | Add support for render targets and viewports.
| * gl_rasterizer: Remove dirty flagsReinUsesLisp2020-02-281-27/+1
| |
* | Merge pull request #3451 from ReinUsesLisp/indexed-texturesbunnei2020-03-051-7/+14
|\ \ | |/ |/| vk_shader_decompiler: Implement indexed textures
| * vk_shader_decompiler: Implement indexed texturesReinUsesLisp2020-02-241-7/+14
| | | | | | | | | | | | | | Implement accessing textures through an index. It uses the same interface as OpenGL, the main difference is that Vulkan bindings are forced to be arrayed (the binding index doesn't change for stacked textures in SPIR-V).
* | Merge pull request #3425 from ReinUsesLisp/layered-framebufferbunnei2020-02-241-8/+9
|\ \ | |/ |/| texture_cache: Implement layered framebuffer attachments
| * texture_cache: Implement layered framebuffer attachmentsReinUsesLisp2020-02-161-8/+9
| | | | | | | | | | | | Layered framebuffer attachments is a feature that allows applications to write attach layered textures to a single attachment. What layer the fragments are written to is decided from the shader using gl_Layer.
* | Merge pull request #3414 from ReinUsesLisp/maxwell-3d-drawbunnei2020-02-191-10/+0
|\ \ | | | | | | maxwell_3d: Unify draw methods
| * | maxwell_3d: Unify draw methodsReinUsesLisp2020-02-141-10/+0
| |/ | | | | | | | | Pass instanced state of a draw invocation as an argument instead of having two separate virtual methods.
* / vk_query_cache: Implement generic query cache on VulkanReinUsesLisp2020-02-141-1/+20
|/
* vk_rasterizer: Use noexcept variants of std::bitsetReinUsesLisp2020-02-041-4/+5
| | | | Removes bounds checking from "texceptions" instances.
* vk_rasterizer: Address feedbackReinUsesLisp2020-01-181-22/+28
|
* vk_rasterizer: Implement Vulkan's rasterizerReinUsesLisp2020-01-171-0/+1135
This abstraction is Vulkan's equivalent to OpenGL's rasterizer. It takes care of joining all parts of the backend and rendering accordingly on demand.