diff --git a/image.go b/image.go index 209f6e252..1febe4635 100644 --- a/image.go +++ b/image.go @@ -23,6 +23,7 @@ import ( "github.com/hajimehoshi/ebiten/v2/internal/atlas" "github.com/hajimehoshi/ebiten/v2/internal/builtinshader" "github.com/hajimehoshi/ebiten/v2/internal/graphics" + "github.com/hajimehoshi/ebiten/v2/internal/graphicscommand" "github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver" "github.com/hajimehoshi/ebiten/v2/internal/shaderir" "github.com/hajimehoshi/ebiten/v2/internal/ui" @@ -396,10 +397,10 @@ const MaxIndicesNum = MaxIndicesCount // MaxVerticesCount is the maximum number of vertices for DrawTriangles and DrawTrianglesShader. // // Deprecated: as of v2.7. Use MaxVertexCount instead. -const MaxVerticesCount = graphics.MaxVertexCount +const MaxVerticesCount = graphicscommand.MaxVertexCount // MaxVertexCount is the maximum number of vertices for DrawTriangles and DrawTrianglesShader. -const MaxVertexCount = graphics.MaxVertexCount +const MaxVertexCount = graphicscommand.MaxVertexCount // DrawTriangles draws triangles with the specified vertices and their indices. // @@ -432,9 +433,9 @@ func (i *Image) DrawTriangles(vertices []Vertex, indices []uint16, img *Image, o return } - if len(vertices) > graphics.MaxVertexCount { + if len(vertices) > graphicscommand.MaxVertexCount { // The last part cannot be specified by indices. Just omit them. - vertices = vertices[:graphics.MaxVertexCount] + vertices = vertices[:graphicscommand.MaxVertexCount] } if len(indices)%3 != 0 { panic("ebiten: len(indices) % 3 must be 0") @@ -594,9 +595,9 @@ func (i *Image) DrawTrianglesShader(vertices []Vertex, indices []uint16, shader panic("ebiten: the given shader to DrawTrianglesShader must not be disposed") } - if len(vertices) > graphics.MaxVertexCount { + if len(vertices) > graphicscommand.MaxVertexCount { // The last part cannot be specified by indices. Just omit them. - vertices = vertices[:graphics.MaxVertexCount] + vertices = vertices[:graphicscommand.MaxVertexCount] } if len(indices)%3 != 0 { panic("ebiten: len(indices) % 3 must be 0") diff --git a/internal/graphics/vertex.go b/internal/graphics/vertex.go index 2db42c538..449392cc1 100644 --- a/internal/graphics/vertex.go +++ b/internal/graphics/vertex.go @@ -14,10 +14,6 @@ package graphics -import ( - "math" -) - const ( ShaderImageCount = 4 @@ -44,20 +40,6 @@ const ( const ( VertexFloatCount = 8 - - is32bit = 1 >> (^uint(0) >> 63) - is64bit = 1 - is32bit - - // MaxVertexCount is the maximum number of vertices for one draw call. - // - // On 64bit architectures, this value is 2^32-1, as the index type is uint32. - // This value cannot be exactly 2^32 especially with WebGL 2, as 2^32th vertex is not rendered correctly. - // See https://registry.khronos.org/webgl/specs/latest/2.0/#5.18 . - // - // On 32bit architectures, this value is an adjusted number so that MaxVertexFloatCount doesn't overflow int. - MaxVertexCount = is64bit*math.MaxUint32 + is32bit*(math.MaxInt32/VertexFloatCount) - - MaxVertexFloatCount = MaxVertexCount * VertexFloatCount ) var ( diff --git a/internal/graphicscommand/commandqueue.go b/internal/graphicscommand/commandqueue.go index eda936e81..25fae5894 100644 --- a/internal/graphicscommand/commandqueue.go +++ b/internal/graphicscommand/commandqueue.go @@ -27,6 +27,22 @@ import ( "github.com/hajimehoshi/ebiten/v2/internal/shaderir" ) +const ( + is32bit = 1 >> (^uint(0) >> 63) + is64bit = 1 - is32bit + + // MaxVertexCount is the maximum number of vertices for one draw call. + // + // On 64bit architectures, this value is 2^32-1, as the index type is uint32. + // This value cannot be exactly 2^32 especially with WebGL 2, as 2^32th vertex is not rendered correctly. + // See https://registry.khronos.org/webgl/specs/latest/2.0/#5.18 . + // + // On 32bit architectures, this value is an adjusted number so that maxVertexFloatCount doesn't overflow int. + MaxVertexCount = is64bit*math.MaxUint32 + is32bit*(math.MaxInt32/graphics.VertexFloatCount) + + maxVertexFloatCount = MaxVertexCount * graphics.VertexFloatCount +) + var vsyncEnabled int32 = 1 func SetVsyncEnabled(enabled bool) { @@ -81,13 +97,13 @@ func (q *commandQueue) appendIndices(indices []uint32, offset uint32) { // mustUseDifferentVertexBuffer reports whether a different vertex buffer must be used. func mustUseDifferentVertexBuffer(nextNumVertexFloats int) bool { - return nextNumVertexFloats > graphics.MaxVertexFloatCount + return nextNumVertexFloats > maxVertexFloatCount } // EnqueueDrawTrianglesCommand enqueues a drawing-image command. func (q *commandQueue) EnqueueDrawTrianglesCommand(dst *Image, srcs [graphics.ShaderImageCount]*Image, vertices []float32, indices []uint32, blend graphicsdriver.Blend, dstRegion image.Rectangle, srcRegions [graphics.ShaderImageCount]image.Rectangle, shader *Shader, uniforms []uint32, evenOdd bool) { - if len(vertices) > graphics.MaxVertexFloatCount { - panic(fmt.Sprintf("graphicscommand: len(vertices) must equal to or less than %d but was %d", graphics.MaxVertexFloatCount, len(vertices))) + if len(vertices) > maxVertexFloatCount { + panic(fmt.Sprintf("graphicscommand: len(vertices) must equal to or less than %d but was %d", maxVertexFloatCount, len(vertices))) } split := false