Experimental HLSL shaders - cbuffer Time not bound #12263

Closed
opened 2026-01-31 03:10:43 +00:00 by claunia · 7 comments
Owner

Originally created by @softmonkey on GitHub (Jan 29, 2021).

Environment

Platform ServicePack Version VersionString
Win32NT 10.0.19042.0 Microsoft Windows NT 10.0.19042.0

Steps to reproduce

  1. Write a simple HLSL shader that uses Time such as:
  // The original retro pixel shader
  Texture2D shaderTexture;
  SamplerState samplerState;
  
  cbuffer PixelShaderSettings {
    float  Time;
    float  Scale;
    float2 Resolution;
    float4 Background;
  };
  
  float4 main(float4 pos : SV_POSITION, float2 tex : TEXCOORD) : SV_TARGET
  {
    // Read the color value at the current texture coordinate (tex)
    //  float4 is tuple of 4 floats, rgba
    float4 color = shaderTexture.Sample(samplerState, tex);
    
    // Vertical scroll
    tex.y+= Time;
    color.rg = tex * 0.5f;
    
    // Return the final color
    return color;
  }

2, Add it to your profile config

Expected behavior

I am expecting the example shader to scroll vertically. Time is useful for a number of effects.

Actual behavior

Shader is compiling fine, so suspect an error in the binding.
See TODO terminal/blob/main/src/renderer/dx/DxRenderer.cpp, DxEngine::_ComputePixelShaderSettings()

Originally created by @softmonkey on GitHub (Jan 29, 2021). <!-- 🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨 I ACKNOWLEDGE THE FOLLOWING BEFORE PROCEEDING: 1. If I delete this entire template and go my own path, the core team may close my issue without further explanation or engagement. 2. If I list multiple bugs/concerns in this one issue, the core team may close my issue without further explanation or engagement. 3. If I write an issue that has many duplicates, the core team may close my issue without further explanation or engagement (and without necessarily spending time to find the exact duplicate ID number). 4. If I leave the title incomplete when filing the issue, the core team may close my issue without further explanation or engagement. 5. If I file something completely blank in the body, the core team may close my issue without further explanation or engagement. All good? Then proceed! --> <!-- This bug tracker is monitored by Windows Terminal development team and other technical folks. **Important: When reporting BSODs or security issues, DO NOT attach memory dumps, logs, or traces to Github issues**. Instead, send dumps/traces to secure@microsoft.com, referencing this GitHub issue. If this is an application crash, please also provide a Feedback Hub submission link so we can find your diagnostic data on the backend. Use the category "Apps > Windows Terminal (Preview)" and choose "Share My Feedback" after submission to get the link. Please use this form and describe your issue, concisely but precisely, with as much detail as possible. --> # Environment Platform | ServicePack | Version | VersionString --- | --- | --- | --- Win32NT | |10.0.19042.0 | Microsoft Windows NT 10.0.19042.0 # Steps to reproduce 1. Write a simple HLSL shader that uses Time such as: ``` // The original retro pixel shader Texture2D shaderTexture; SamplerState samplerState; cbuffer PixelShaderSettings { float Time; float Scale; float2 Resolution; float4 Background; }; float4 main(float4 pos : SV_POSITION, float2 tex : TEXCOORD) : SV_TARGET { // Read the color value at the current texture coordinate (tex) // float4 is tuple of 4 floats, rgba float4 color = shaderTexture.Sample(samplerState, tex); // Vertical scroll tex.y+= Time; color.rg = tex * 0.5f; // Return the final color return color; } ``` 2, Add it to your profile config # Expected behavior I am expecting the example shader to scroll vertically. Time is useful for a number of effects. # Actual behavior Shader is compiling fine, so suspect an error in the binding. See TODO terminal/blob/main/src/renderer/dx/DxRenderer.cpp, DxEngine::_ComputePixelShaderSettings()
Author
Owner

@zadjii-msft commented on GitHub (Jan 29, 2021):

Oh yea, yikes. That TODO definitely should be tracked somewhere, thanks! We probably should have made sure to do that before we shipped the shader out, clearly I forgot 😅

@zadjii-msft commented on GitHub (Jan 29, 2021): Oh yea, yikes. That TODO definitely _should_ be tracked somewhere, thanks! We probably should have made sure to do that before we shipped the shader out, clearly I forgot 😅
Author
Owner

@Nacimota commented on GitHub (Feb 1, 2021):

This feature got me excited enough to actually learn HLSL and have a go at doing some fancy shader effects for the terminal but I was quite disappointed to see the time input wasn't working because it's essential to basically any passive animated effect.

C++ is almost greek to me, but I had a go at fixing it myself and it seems like passing the time in _ComputePixelShaderSettings() where that TODO is doesn't entirely solve the problem because the screen only seems to update when the text changes:

https://user-images.githubusercontent.com/651955/106405266-5c7a2680-6481-11eb-821e-8c4ec19b452c.mp4

I can't figure out if it's that _ComputePixelShaderSettings() needs to be called somewhere else, or if the renderer just doesn't bother redrawing the frame when no updates have been made, or something else entirely, but oh boy is it pretty! I can't wait to see this fixed (by someone that knows what they're doing).

@Nacimota commented on GitHub (Feb 1, 2021): This feature got me excited enough to actually learn HLSL and have a go at doing some fancy shader effects for the terminal but I was quite disappointed to see the time input wasn't working because it's essential to basically any passive animated effect. C++ is almost greek to me, but I had a go at fixing it myself and it seems like passing the time in `_ComputePixelShaderSettings()` where that TODO is doesn't entirely solve the problem because the screen only seems to update when the text changes: https://user-images.githubusercontent.com/651955/106405266-5c7a2680-6481-11eb-821e-8c4ec19b452c.mp4 I can't figure out if it's that `_ComputePixelShaderSettings()` needs to be called somewhere else, or if the renderer just doesn't bother redrawing the frame when no updates have been made, or something else entirely, but oh boy is it pretty! I can't wait to see this fixed (by someone that knows what they're doing).
Author
Owner

@zadjii-msft commented on GitHub (Feb 1, 2021):

Let me just start with a WOW 👀! When we first added these shaders, this is exactly the kind of cool thing I was expecting people to be able to do with them. That looks awesome!

You're right in finding that our renderer only paints a frame when the contents of the window have changed. So yea, right now you need to be constantly emitting text or blinking the cursor or whatever to have the effect be "smooth". This is something we did a long time ago to try and save CPU cycles. Obviously though, that optimization doesn't make any sense if we want to let people make smooth graphical effects.

If you make the PR to bind Time to something, then we can on our side hook up the DxEngine to the RenderThread to tell it to manually paint a frame every 1/60th of a second (when the pixel shader effects are enabled). Sound like a plan?

/cc @miniksa (our renderer expert)

@zadjii-msft commented on GitHub (Feb 1, 2021): Let me just start with a WOW 👀! When we first added these shaders, this is exactly the kind of cool thing I was expecting people to be able to do with them. That looks awesome! You're right in finding that our renderer only paints a frame when the contents of the window have changed. So yea, right now you need to be constantly emitting text or blinking the cursor or whatever to have the effect be "smooth". This is something we did a long time ago to try and save CPU cycles. Obviously though, that optimization doesn't make any sense if we want to let people make smooth graphical effects. If you make the PR to bind `Time` to something, then we can on our side hook up the `DxEngine` to the `RenderThread` to tell it to manually paint a frame every 1/60th of a second (when the pixel shader effects are enabled). Sound like a plan? /cc @miniksa (our renderer expert)
Author
Owner

@Nacimota commented on GitHub (Feb 1, 2021):

That sounds good to me. As I said, I'm not really a C++ guy so I'm not sure I'm getting/setting the time in the most sensible way, but if you folks are willing to entertain my lack of experience with some constructive review I'll happily take a stab at it.

@Nacimota commented on GitHub (Feb 1, 2021): That sounds good to me. As I said, I'm not really a C++ guy so I'm not sure I'm getting/setting the time in the most sensible way, but if you folks are willing to entertain my lack of experience with some constructive review I'll happily take a stab at it.
Author
Owner

@zadjii-msft commented on GitHub (Feb 1, 2021):

I'm always happy to help! I'm not sure anyone can confidently call themselves a C++ guy, no matter how much experience they have with the language 😜

@zadjii-msft commented on GitHub (Feb 1, 2021): I'm always happy to help! I'm not sure anyone can confidently call themselves a C++ guy, no matter how much experience they have with the language 😜
Author
Owner

@miniksa commented on GitHub (Feb 1, 2021):

If you make the PR to bind Time to something, then we can on our side hook up the DxEngine to the RenderThread to tell it to manually paint a frame every 1/60th of a second (when the pixel shader effects are enabled). Sound like a plan?

/cc @miniksa (our renderer expert)

Yeah no problem. I can do that after the Time is piped through... force the ticks to happen anyway when shaders are enabled.

Do note that this will only make the performance characteristics of this even heavier (more CPU, more battery/power, etc.) but I think we're well past caring about that point when using shaders anyway especially given that shaders enabled right now already forces full-screen repaint instead of differential drawing.

@miniksa commented on GitHub (Feb 1, 2021): > If you make the PR to bind `Time` to something, then we can on our side hook up the `DxEngine` to the `RenderThread` to tell it to manually paint a frame every 1/60th of a second (when the pixel shader effects are enabled). Sound like a plan? > > /cc @miniksa (our renderer expert) Yeah no problem. I can do that after the `Time` is piped through... force the ticks to happen anyway when shaders are enabled. Do note that this will only make the performance characteristics of this even heavier (more CPU, more battery/power, etc.) but I think we're well past caring about that point when using shaders anyway especially given that shaders enabled right now already forces full-screen repaint instead of differential drawing.
Author
Owner

@ghost commented on GitHub (Feb 11, 2021):

:tada:This issue was addressed in #8994, which has now been successfully released as Windows Terminal Preview v1.6.10412.0.🎉

Handy links:

@ghost commented on GitHub (Feb 11, 2021): :tada:This issue was addressed in #8994, which has now been successfully released as `Windows Terminal Preview v1.6.10412.0`.:tada: Handy links: * [Release Notes](https://github.com/microsoft/terminal/releases/tag/v1.6.10412.0) * [Store Download](https://www.microsoft.com/store/apps/9n8g5rfz9xk3?cid=storebadge&ocid=badge)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/terminal#12263