From e7feccdee17a4352e94471f71cebc87be7679430 Mon Sep 17 00:00:00 2001 From: Ravi Shankar Date: Sat, 5 Oct 2024 20:49:10 +0530 Subject: [PATCH] docs updated --- .gitignore | 3 ++ docs/.vitepress/config.mts | 5 ++- docs/index.md | 4 +- docs/public/vkcube.png | Bin 0 -> 62999 bytes docs/rust/dev-env-setup.md | 41 ++++++++++++++++++++ docs/rust/index.md | 7 +++- docs/rust/overview.md | 7 +--- docs/rust/tutorial-overview.md | 67 +++++++++++++++++++++++---------- 8 files changed, 105 insertions(+), 29 deletions(-) create mode 100644 docs/public/vkcube.png create mode 100644 docs/rust/dev-env-setup.md diff --git a/.gitignore b/.gitignore index c6bba59..f94b84b 100644 --- a/.gitignore +++ b/.gitignore @@ -128,3 +128,6 @@ dist .yarn/build-state.yml .yarn/install-state.gz .pnp.* + + +**.DS_Store diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 71ad3ca..131c3b3 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -18,11 +18,14 @@ export default defineConfig({ text: 'Introduction', link: '/rust' }, { - text: 'Overview(Skip)', link: '/rust/overview' + text: 'Overview', link: '/rust/overview' }, { text: 'Tutorial Overview', link: '/rust/tutorial-overview' }, + { + text: 'Development environment setup', link: '/rust/dev-env-setup' + }, // { // text: 'Chapter 1', // items: [ diff --git a/docs/index.md b/docs/index.md index e881317..8a2e9f5 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,8 +18,10 @@ features: - title: Guideline 1 details: If something can be said in fewer words, say it in fewer words - title: Guideline 2 - details: If a concept needs to be repeated, repeat it + details: If a concept needs to be repeated, repeat it rather than pasting a link - title: Guideline 3 details: Assume zero knowledge, even for the programming language that we are using + - title: Guideline 4 + details: Minimise external links as much as possible --- diff --git a/docs/public/vkcube.png b/docs/public/vkcube.png new file mode 100644 index 0000000000000000000000000000000000000000..6044d711791ce6d0a6e3e873ef1ac2b555275e6d GIT binary patch literal 62999 zcmeGE^qI64lBS?3HbfzPgMTLa?0Lt|o04EDXXwz(7`y7!#7uuH@( zVl?DYerI zQomjtZJw*YFI{koXR8dkc$_WZAYlK9L_3aG67%Axcw`6)k_$0x;~ELiHnBN9gG+by z9B&WyH4M)H;#y2D1aWO6w;-#DO4yXSLqXzIr%kkfl0T2>=N-yTxXW$X@ZE^*vl87! z#GDY9OB>o+I3D~pg)ob3(U|h13d^ZW=1x!M6Bz`zK9pB$Ae12dl>ztdqZ;&))2|iw zRm9n{$aYZH`VCJ{hs0n8b=6P)$Q6}IhCFjUQH${( zjbMo+hzltZm6oe$UC=cKStsovS4@A_(4~?aIs}qA4FGx{zZf z{X^6L;XJx%@gp5ot(8u%)+>59%S2J{>{qGGy=8u;7O6CN5b7BCkb5EO!7-8>I5Ju& zLfBjzPl&&XmWETKQPTX?P(r-HZIpox=FfuZhu^5uD8ECczdu(ooc!ULh|LI+z?S%< zu|$Z4B8|fvN-B)QE6ectx&OC61SKNb7kEEYgxpZ8VITJ!FZx*KE=w>8w?%UXrlSS ze=LJ1x<_%r*aAy`kQPzPWo@&=DV``U5{>rs-Txj2CvIZjRKhR6|1d#8C1ZTb)(Yy~Tq&?WHuX+?48t*p8jL zd3R+yeaS4$Zc-~j3pP*k9&a~qw`bDl_uAdd=6zU!26*~=B;ey}q$|p!qoc<_32_bq=Zl$ zwez>Y)q7er^sfwRy+}Or6?mw<&sJ%>l<){bd+7(2$UjFZ;WP1)7{z{}cS^#rLDdPn zdrv8&K~IwCy@7Lrx1;bNw_Hf7BI~7XJw;9xDFqr=M>idMV*Z%kEF_G^x^SIgdl4GYU*$$FNwS2-@G#nJJCwbgaiOT89tju5V zy$Nv$N56MYDf_B35*W!*6re7~4E8#&QLbUE5w8WWp<9U^^VBBD(UT=oDoK80{rvum zCL1$|{(yms#f-`8^YUkbfnpmHcW#mJS4<>HLjwVW&;f(Nu>l%Z;}`7FBuvrt1;fP^ z1^Wg3+MK$gFKJ2_^eD=41#&ah&Ez;rX0*q&j8=SngOer2M3dLcQ1r*w$F~p4DSpN30^)$PyYsEUtPAIaw_ z`p8Fk796MEP1!qJQChv?Teb;=wLm}GuDN^$)h%zND>uKKoSN0MYFj>Q*>Q1}5KPM% z;u;+@`@5yaihqsh(1yW$eO^5NZ&+JPEFmvO6cC&zapV1^K6yOm6Y_o`*0k$ZqX*%5^dJp zw(M=)rtWF7JF|8%xYT2IXuh?4@OCE&Q9Hj*te8ePV)R4gNcj)eAJgCS``4pGOYAFq z`Li_3@yjC10iEs4b82{+a{{Zi39Sj=?IScJxZpw~KJ6|Mc^P@%t6@h;-QnE>Ap8oC6B%t#HatQPQErxHZT(MI+~ z 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 Bu<`%^ literal 0 HcmV?d00001 diff --git a/docs/rust/dev-env-setup.md b/docs/rust/dev-env-setup.md new file mode 100644 index 0000000..e6eb7cc --- /dev/null +++ b/docs/rust/dev-env-setup.md @@ -0,0 +1,41 @@ +--- +prev: + text: 'Tutorial Overview' + link: '/rust/tutorial-overview' +# next: +# text: 'Development environment setup' +# link: '/rust/dev-env-setup' +outline: [2,3] +--- + +# Development environment setup + +## **macOS** +This instructions assume that you are running macOS 10.11 or later, have Apple silicon, and your laptop support Metal API. + +### homebrew +If you don't have brew installed, please [install it from here](https://brew.sh/) + +### Rust +Ensure you have latest version of rust. You can [install it from here](https://www.rust-lang.org/tools/install) + +### Visual studio code or any code editor +Ensure you have latest version of VS Code, you can [install it from here](https://code.visualstudio.com/download). If you prefer, you can use any other code editor of your choice. + +### Vulkan SDK +Please download and install [Vulkan SDK](https://vulkan.lunarg.com/). If installed properly, you will vkCube in your application. If you run that, you should see rotating vkCube, something similar to this. +![vkcube screenshot](/vkcube.png) + +Once you have verified vulkan SDK installation, add the following lines to your `~/.zshrc` file. +``` shell +export VULKAN_SDK=$HOME/VulkanSDK//macOS +export DYLD_FALLBACK_LIBRARY_PATH=$VULKAN_SDK/lib +export VK_ICD_FILENAMES=$VULKAN_SDK/share/vulkan/icd.d/MoltenVK_icd.json +export VK_LAYER_PATH=$VULKAN_SDK/share/vulkan/explicit_layer.d +``` + +::: info +Don't forget to replace `` with the actual version installed. On some systems, the installation path is slightly different, please ensure the correct path is exported. +::: + +If everything went as planned, we are ready to start learning Vulkan. \ No newline at end of file diff --git a/docs/rust/index.md b/docs/rust/index.md index f342a78..5b45bde 100644 --- a/docs/rust/index.md +++ b/docs/rust/index.md @@ -6,7 +6,9 @@ next: # Introduction -In this tutorial, we will learn to write programs that utilise Vulkan APIs. The implementation language of choice will be Rust. I learnt Vulkan directly from scratch, and have zero idea about other graphics APIs such as OpenGL, DirectX or Metal. This implies that this tutorial assumes no previous graphics knowledge. If you are looking for something that build on top of your prior knowledge/skills, then you should look elsewhere. +In this tutorial, we will learn to write programs that utilise Vulkan APIs. The implementation language of choice will be Rust. I learnt Vulkan directly from scratch, and I shifted to other APIs only after I had a decent grasp over vulkan. This strengthened my belief that one can learn vulkan directly, and so this tutorial is aimed at making you learn vulkan directly without prior graphics knowledge. If you are looking for something that build on top of your prior knowledge/skills, then you should look elsewhere. + +Many authers/bloggers suggest learning OpenGL first before learning vulkan. I don't subscribe to that school of thought. Just because someone can't teach, doesn't mean you cannot learn. As a author, its my job to collect all the resources that you need in one place, so that you don't have to hop around here and there and accumulate confision. ## Prerequisites @@ -16,5 +18,6 @@ In this tutorial, we will learn to write programs that utilise Vulkan APIs. The ## Tutorial Guidelines - If something can be said in fewer words, say it in fewer words -- If a concept needs to be repeated, repeat it +- If a concept needs to be repeated, repeat it rather than pasting a link - Assume zero knowledge, even for the programming language that we are using +- Minimise external links as much as possible diff --git a/docs/rust/overview.md b/docs/rust/overview.md index 3ecd7f5..a4727b4 100644 --- a/docs/rust/overview.md +++ b/docs/rust/overview.md @@ -8,7 +8,7 @@ next: --- # Overview ::: warning -This page contains useless and boring information, with the sole intention of making you feel good. You won't loose anything by skipping it. +This section is meant for absolute begineers. Experienced developers won't benefit, so they should skip this section. ::: ## Vulkan overview @@ -17,13 +17,10 @@ Vulkan is a verbose API. Actually, its a very verbose API. Evrything it needs to But that is exactly why you are here. It's my responsibility to simplify it, and make it as interesting as it can be. If you fail, its my failure. ## GPUs overview -::: tip -Save your time by skipping this section if you understand what GPUs are. -::: IT industry largely revolves around softwares that gets executed on CPUs. Which can execute only one instruction at a time. If you have a multi-core CPU, then you can run a few instructions at a time. You take advantage of multi-threading and you **feel** like you are running everything at once. But, even you taking into use the best hardware and software constructs, the number of instructions that you can execute at once on CPU is fairly small. But, CPUs can execute every kind of instruction that can be there. They are the best generalists. -There exists other hardwares that are not generalists. They can do just one type of work, and because they can do just one type of work, you gets to remove all the functionalities needed to make it general purpose. By removing these extra functionalities, the hardware gets so simplified that they become cheap and small and less power hungry. And because they are cheap, small, and less power hungry, its possible to have lakhs(million/10) of such hardwares on a single chip. And such chips can run lakhs(million/10) of instructions and once. GPU(Graphics Processing Unit) is one such hardware. +There exists other hardwares that are not generalists. They can do just one type of work, and because they can do just one type of work, you get to remove all the functionalities needed to make it general purpose. By removing these extra functionalities, the hardware gets so simplified that they become cheap and small and less power hungry. And because they are cheap, small, and less power hungry, its possible to have lakhs(million/10) of such hardwares on a single chip. And such chips can run lakhs(million/10) of instructions and once. GPU(Graphics Processing Unit) is one such hardware. If you watch [this video by NVIDIA](https://www.youtube.com/watch?v=-P28LKWTzrI), I will probably to able to drive home my point. diff --git a/docs/rust/tutorial-overview.md b/docs/rust/tutorial-overview.md index a641258..03664e7 100644 --- a/docs/rust/tutorial-overview.md +++ b/docs/rust/tutorial-overview.md @@ -2,34 +2,61 @@ prev: text: 'Overview' link: '/rust/overview' -# next: -# text: 'New intro' -# link: '/rust/markdown-examples' +next: + text: 'Development environment setup' + link: '/rust/dev-env-setup' --- -# Overview -::: warning -This page contains useless and boring information, with the sole intention of making you feel good. You won't loose anything by skipping it. +# Tutorial Overview +As said in the last section, specialised hardwares(read GPUs), have their own tantrums. First we will look at nuances involved in programming for graphics hardwares. And then we will look into how vulkan handles them. + + +## Graphics Programming nuances +::: danger +If you are an absolute begineer, this sub-section will scare you. You will have to bear with me. It starts to get easy from here. ::: +In normal programming(read CPUs), we create data either in stack or heap memory. Our CPU can read/modify them. In case of GPUs, this becomes complicated. They don't read write data the way CPUs do. -## Vulkan overview -Vulkan is a verbose API. Actually, its a very verbose API. Evrything it needs to execute an instruction, it will expect you to provide it. And the way to pass these data will be in object/struct kind of construct. Even you are a very smart person, it will still take a lot of time to digest and internalise everything. Many a times, you will feel like you have hit a roadblock, the frustration will make you want to give up. +To pass data to GPUs, we create buffers with specific parameters, and then we ask GPUs to read from there. And once GPUs are done processing the data, they can write them back to speciliased buffers for CPUs to read. -But that is exactly why you are here. It's my responsibility to simplify it, and make it as interesting as it can be. If you fail, its my failure. +In many a cases, to optimise for speed or otherwise, the data has to pass through two buffers. In one buffer, CPU writes, it is then transferred to another buffer that is specialised for faster access by GPU. And the GPUs read it from there. -## GPUs overview -::: tip -Save your time by skipping this section if you understand what GPUs are. -::: +Even the instructions for GPUs to process these data is written differently. We write instructions to process just one data, but the GPUs apply the same instruction on each and every data. And the language for writing instructions to process data is also different, we call it a shader language. + +If we want to command/ask the GPU to use our shader instructions to process the data that we wrote in buffers. Then these command also has to go through a buffer. -IT industry largely revolves around softwares that gets executed on CPUs. Which can execute only one instruction at a time. If you have a multi-core CPU, then you can run a few instructions at a time. You take advantage of multi-threading and you **feel** like you are running everything at once. But, even you taking into use the best hardware and software constructs, the number of instructions that you can execute at once on CPU is fairly small. But, CPUs can execute every kind of instruction that can be there. They are the best generalists. +There are a lot of steps involved in calculating the final pixels that is being drawn on the screen. And quite a few of them are customizable by us. And we have to provide that customizations to be able to get output. + +Things we do in Graphics programming (Inexhaustive list, and in no particular order): +- Make data visible to GPU through buffers +- Write instructions for processing these data in shader language +- Provide customisations/parameters for modifying steps involved in calculating final pixel +- Provide commands to GPU through command buffer + +Some Graphic APIs handle some of the above things by themselves, by assuming stuffs on your behalf. But, vulkan needs you to specify them categorically. + +::: info +Almost all the authors/bloggers in this space where we teach graphic programming have a habbit of keep comparing different Graphic APIs, such as OpenGL vs Vulkan etc. I will not do that. I believe that begineers get more distracted and confused by that approach, and the experts don't need them. +::: -There exists other hardwares that are not generalists. They can do just one type of work, and because they can do just one type of work, you gets to remove all the functionalities needed to make it general purpose. By removing these extra functionalities, the hardware gets so simplified that they become cheap and small and less power hungry. And because they are cheap, small, and less power hungry, its possible to have lakhs(million/10) of such hardwares on a single chip. And such chips can run lakhs(million/10) of instructions and once. GPU(Graphics Processing Unit) is one such hardware. +## Steps in rendering a triangle using vulkan +Rendering a triangle exposes bulk of the complexities involved in graphics programming. Let's see what we will need to do to draw a triangle using Vulkan. -If you watch [this video by NVIDIA](https://www.youtube.com/watch?v=-P28LKWTzrI), I will probably to able to drive home my point. +1. Creating a vulkan Instance +1. Choose a physical device +1. Create a logical device(mapped to physical device) +1. Select queue families for chosen device +1. Create a window +1. Create a window surface +1. Create a swapchain + 1. Acquire image from swapchain + 1. Create imageview for image acquired from swapchain +1. Create a framebuffer +1. Create a Renderpass +1. Create a Graphics pipeline +1. Create a command Pool +1. Get allocated commandbuffer from CommandPool +1. Main loop to orchestrate all the above steps -## GPU/Graphics Programming overview -Because GPUs are very specialised hardwares, they have a lot of tantrums w.r.t. to how you give instructions and data to them, and how you get back the results. Another reason for these tantrums are that they have been less researched and innivated upon as compared to CPUs. +Looks like a lot? Don't worry. We will have proper sections dedicated to each step in the above list. And I will ensure that you understand it. -Vulkan, or any graphics API, sits between you and the hardware. Some of these APIs are good at handling these tantrums themselves, and make your life easy. Some, including vulkan, believe that by handling all these tantrums, they will end up making this middle layer fat. And these fat middle layers will take away power from the users. And that's the reason why you vulkan is a very verbose API. -The advantage of learning vulkan is that you get to learn all the nuances of graphics programming. You are more in control, and you can easily master other APIs, whevener you need to.