Skip to content

add first prototype of texElementImage2D#3752

Draft
cabanier wants to merge 2 commits intoKhronosGroup:mainfrom
cabanier:texElementImage2D
Draft

add first prototype of texElementImage2D#3752
cabanier wants to merge 2 commits intoKhronosGroup:mainfrom
cabanier:texElementImage2D

Conversation

@cabanier
Copy link
Copy Markdown

Copy link
Copy Markdown
Member

@kenrussell kenrussell left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One initial comment. Likely this PR will remain unmerged for a while until there are prototype implementations of this new API. In the meantime, progress can be made on the API's semantics, addressing the TBD mentioned here, etc.

Comment thread specs/latest/2.0/index.html Outdated
<p>The width and height of the texture are derived from the CSS width and height of the element at the time of rendering. Add links to whatwg.</p>
<p>TBD: define state of rendering + security. These will be more links to whatwg</p><p></p>
<p>If no WebGLBuffer is bound to the <code>PIXEL_PACK_BUFFER</code> target, generates an
<code>INVALID_OPERATION</code> error.</p>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This validation related to PIXEL_PACK_BUFFER looks reversed; if a buffer's bound to that target then the textures' contents come from it. I think that instead this should say "If a WebGLBuffer is bound...", since the goal is for the texture's contents to come from the rendered element.

@foolip
Copy link
Copy Markdown

foolip commented Dec 19, 2025

@foolip
Copy link
Copy Markdown

foolip commented Mar 20, 2026

The answer to WICG/html-in-canvas#68 in this PR seems to be that we do keep level, and that's what we have in Chromium's implementation. Just flagging the point of discussion in case someone feels differently.

@foolip
Copy link
Copy Markdown

foolip commented Mar 20, 2026

@cabanier what's still needed to make this ready for review? whatwg/html#11588 is making steady progress and I want to make sure the WebGL side is in sync.

Importantly, the HTML spec now has a concept of an "element image snapshot" which is what must be used in canvas APIs like this one. Can you update the spec text to use that concept? You can use a direct link to https://whatpr.org/html/11588/canvas.html#concept-canvas-element-image-snapshots until the HTML spec PR is merged.

</dt>
<dd>
<p>Renders the given element to the currently bound WebGLTexture.</p>
<p>The width and height of the texture are derived from the CSS borderbox of the element at the time of rendering. Add links to whatwg.</p>
Copy link
Copy Markdown

@jakearchibald jakearchibald Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems pretty limiting compared to the 2d equivalent. Could this take optional width & height args? This seems especially important for high-dpr.

It also seems to be desirable to use a portion of an element in a texture, eg for extreme zoomed cases. This is also something you can do with the 2d API.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the IDL changes in this PR are a bit behind; the current chromium implementation has four overrides for texElementImage2D which allow for specification of both source rect (for painting a section of an element, or for extending the painted area to include ink overflow) and also destination size (i.e. texture size).

@foolip can you update the PR to match the chromium implementation?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The width/height was there originally but we were told that those APIs were going to be removed in the future. Has that changed?
What is the difference between passing width/height and setting it on the element?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting it on the element means scaling everything else up within it, which is a pain. Trying to deal with the sub-rect case is even more painful.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@szager-chromium that's good to hear. Although, it's a little frustrating that for some things, the explainer is more up to date, and for other things the PRs are more up to date, and for other things, like this, neither has the details.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cabanier -- yes, the IDL in the chromium repo represents our most current thinking. We just followed the paradigm of texImage2D, which allows a scaling factor to be specified via optional width/height parameters. If those parameters are omitted, then the size of the texture will be set so that blitting the texture into the canvas will cause the image to appear with the same visual proportions it would have were it placed outside the canvas.

Note that the WebGPU version of the API doesn't allow implicit scaling via width/height, which aligns with WebGPU's handling of images via copyImageToTexture.

Copy link
Copy Markdown

@jakearchibald jakearchibald Apr 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where's the up to date proposal for the WebGPU API addition?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure there is one. I found an issue tracking this, but I'm not aware of any completed spec work. As with WebGL, I think the IDL in the chromium repository might be the most up-to-date reference.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now that I'm looking at the code (which ironically I wrote), I see there there is a variant that allows you specify destination width/height, and applies that as a scale factor to the element's paint record. There is also a variant that allows you to specify a source rect that behaves the same as for texElementImage2D. There is not however a variant that allows you specify both of those.

I can't remember what I was thinking there, but the WebGPU API shape has definitely not had a lot of scrutiny yet, and can still be easily changed.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It does seem worth having an API that allows both. It'd seem odd if the WebGPU version was the least capable.

I guess this can get more review when it's properly proposed somewhere.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants