Fix some strict GL ES 2 conformance issues.

This commit fixes two issues that cause issues in WebGL:
  * Non-power-of-two textures must wrap as GL_CLAMP_TO_EDGE.
    This breaks non-power-of-two textures.
  * Render calls with zero primitives should not be issued.
    This just causes warning spam.
pull/339/head
whitequark 2018-07-18 19:40:14 +00:00
parent 02ec64ee66
commit 738ac02cbf
2 changed files with 26 additions and 9 deletions

View File

@ -272,6 +272,8 @@ void MeshRenderer::Remove(const MeshRenderer::Handle &handle) {
void MeshRenderer::Draw(const MeshRenderer::Handle &handle, void MeshRenderer::Draw(const MeshRenderer::Handle &handle,
bool useColors, RgbaColor overrideColor) { bool useColors, RgbaColor overrideColor) {
if(handle.size == 0) return;
selectedShader->Enable(); selectedShader->Enable();
glBindBuffer(GL_ARRAY_BUFFER, handle.vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, handle.vertexBuffer);
@ -575,6 +577,8 @@ void EdgeRenderer::Remove(const EdgeRenderer::Handle &handle) {
} }
void EdgeRenderer::Draw(const EdgeRenderer::Handle &handle) { void EdgeRenderer::Draw(const EdgeRenderer::Handle &handle) {
if(handle.size == 0) return;
glActiveTexture(GL_TEXTURE1); glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, atlas->GetTexture(pattern)); glBindTexture(GL_TEXTURE_2D, atlas->GetTexture(pattern));
shader.SetUniformTextureUnit("pattern", 1); shader.SetUniformTextureUnit("pattern", 1);
@ -774,6 +778,8 @@ void OutlineRenderer::Remove(const OutlineRenderer::Handle &handle) {
} }
void OutlineRenderer::Draw(const OutlineRenderer::Handle &handle, Canvas::DrawOutlinesAs mode) { void OutlineRenderer::Draw(const OutlineRenderer::Handle &handle, Canvas::DrawOutlinesAs mode) {
if(handle.size == 0) return;
glActiveTexture(GL_TEXTURE1); glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, atlas->GetTexture(pattern)); glBindTexture(GL_TEXTURE_2D, atlas->GetTexture(pattern));
shader.SetUniformTextureUnit("pattern", 1); shader.SetUniformTextureUnit("pattern", 1);
@ -980,15 +986,17 @@ IndexedMeshRenderer::Handle IndexedMeshRenderer::Add(const SIndexedMesh &m, bool
return handle; return handle;
} }
void IndexedMeshRenderer::Remove(const IndexedMeshRenderer::Handle &m) { void IndexedMeshRenderer::Remove(const IndexedMeshRenderer::Handle &handle) {
glDeleteBuffers(1, &m.vertexBuffer); glDeleteBuffers(1, &handle.vertexBuffer);
glDeleteBuffers(1, &m.indexBuffer); glDeleteBuffers(1, &handle.indexBuffer);
} }
void IndexedMeshRenderer::Draw(const IndexedMeshRenderer::Handle &m) { void IndexedMeshRenderer::Draw(const IndexedMeshRenderer::Handle &handle) {
if(handle.size == 0) return;
selectedShader->Enable(); selectedShader->Enable();
glBindBuffer(GL_ARRAY_BUFFER, m.vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, handle.vertexBuffer);
glEnableVertexAttribArray(ATTRIB_POS); glEnableVertexAttribArray(ATTRIB_POS);
glVertexAttribPointer(ATTRIB_POS, 3, GL_FLOAT, GL_FALSE, sizeof(SIndexedMesh::Vertex), glVertexAttribPointer(ATTRIB_POS, 3, GL_FLOAT, GL_FALSE, sizeof(SIndexedMesh::Vertex),
(void *)offsetof(SIndexedMesh::Vertex, pos)); (void *)offsetof(SIndexedMesh::Vertex, pos));
@ -998,8 +1006,8 @@ void IndexedMeshRenderer::Draw(const IndexedMeshRenderer::Handle &m) {
(void *)offsetof(SIndexedMesh::Vertex, tex)); (void *)offsetof(SIndexedMesh::Vertex, tex));
} }
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m.indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle.indexBuffer);
glDrawElements(GL_TRIANGLES, m.size, GL_UNSIGNED_INT, NULL); glDrawElements(GL_TRIANGLES, handle.size, GL_UNSIGNED_INT, NULL);
glDisableVertexAttribArray(ATTRIB_POS); glDisableVertexAttribArray(ATTRIB_POS);
if(NeedsTexture()) glDisableVertexAttribArray(ATTRIB_TEX); if(NeedsTexture()) glDisableVertexAttribArray(ATTRIB_TEX);

View File

@ -259,14 +259,23 @@ Canvas::Fill *OpenGl2Renderer::SelectFill(hFill hcf) {
return fill; return fill;
} }
static bool IsPowerOfTwo(size_t n) {
return (n & (n - 1)) == 0;
}
void OpenGl2Renderer::InvalidatePixmap(std::shared_ptr<const Pixmap> pm) { void OpenGl2Renderer::InvalidatePixmap(std::shared_ptr<const Pixmap> pm) {
GLuint id; GLuint id;
pixmapCache.Lookup(pm, &id); pixmapCache.Lookup(pm, &id);
glBindTexture(GL_TEXTURE_2D, id); glBindTexture(GL_TEXTURE_2D, id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); if(IsPowerOfTwo(pm->width) && IsPowerOfTwo(pm->height)) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
} else {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
GLenum format; GLenum format;
switch(pm->format) { switch(pm->format) {