Should I use const in this function argument? I'm working on getting myself comfortable with C after only working in high level languages for the past 10 years.  I've done rust as well and really like the concept of notating immutability in functions.
That being said I'm confused on if I should use const wherever the compiler lets me, or just use it where it semantically makes sense (and hope no one comes behind me and does something the caller doesn't expect).
Several functions I am looking at right now are:
void kcr_scene_update(const struct KCR_Scene* scene) {
    scene-&gt;internal-&gt;cubeRotation.x += 0.01f;
    scene-&gt;internal-&gt;cubeRotation.y += 0.01f;
    scene-&gt;internal-&gt;cubeRotation.z += 0.01f;
}

void kcr_display_begin_frame(const struct KCR_Display* display) {
    for (int x = 0; x &lt; display-&gt;windowWidth * display-&gt;windowHeight; x++) {
        display-&gt;pixelBuffer[x] = 0xFF000000;
    }
}


The compiler is allowing these, presumably because it's not changing the root pointer or direct child pointers (I guess?) but is it good practice to put const in these methods when I know there's some mutation going on?
Should I use const in this function argument?

Yes.

Better conveys to a user code's functionality. Consider the user may only see the declaration void kcr_scene_update(const struct KCR_Scene* scene); (in some header file) and not the definition.

Allows increased applicability.  Function can be called with  const struct KCR_Scene* some_pointer.  Without a const in the function signature, the caller is obliged to pass a non-const pointer.

Optimization: Some optimization will only take place when the reference data is const.  This issue applies especially to older compilers.



good practice to put const in these methods when I know there's some mutation going on?

Need to see detail of struct KCR_Scene and struct KCR_Display to know what changes are really occurring in code.

I now see OP really needs to provide more info  - making answer wiki.