Hash :
fdfb2b82
Author :
Date :
2021-04-09T15:42:12
Capture/Replay: Support non-binary GLboolean
This CL contains two changes. One to how we print out GLboolean
values, and another to how we capture GLbooleans.
According to the spec, anything non-zero can be considered
GL_TRUE when setting state:
When the type of internal state is boolean, zero integer or
floating-point values are converted to FALSE and non-zero values
are converted to TRUE.
Dota Underlords is using 0xFF for GL_TRUE.
Before the change, this manifested as:
// logcat
glColorMask(context = 4, red = kUnknownGLenumString,
green = kUnknownGLenumString,
blue = kUnknownGLenumString,
alpha = GL_FALSE)
// trace
glColorMask(GL_INVALID_ENUM, GL_INVALID_ENUM, GL_INVALID_ENUM, GL_FALSE);
After:
// logcat
glColorMask(context = 4, red = 0x00FF,
green = 0x00FF,
blue = 0x00FF,
alpha = GL_FALSE)
// trace
glColorMask(0xFF, 0xFF, 0xFF, GL_FALSE);
Test: MEC for Dota Underlords
Bug: b/185192780
Bug: angleproject:5857
Change-Id: Ie53aeba8d8a40f91ee375467b325d8e6be053a98
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2821947
Commit-Queue: Cody Northrop <cnorthrop@google.com>
Reviewed-by: Tim Van Patten <timvp@google.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// gl_enum_utils.cpp:
// Utility functions for converting GLenums to string.
#include "libANGLE/capture/gl_enum_utils.h"
#include "common/bitset_utils.h"
#include <iomanip>
#include <sstream>
namespace gl
{
const char kUnknownGLenumString[] = "EnumUnknown";
void OutputGLenumString(std::ostream &out, GLenumGroup enumGroup, unsigned int value)
{
const char *enumStr = GLenumToString(enumGroup, value);
if (enumStr != kUnknownGLenumString)
{
out << enumStr;
return;
}
if (enumGroup == GLenumGroup::Boolean)
{
// If an unknown enum was submitted as GLboolean, just write out the value.
if (enumStr == kUnknownGLenumString)
{
out << value;
}
else
{
out << enumStr;
}
return;
}
if (enumGroup != GLenumGroup::DefaultGroup)
{
// Retry with the "Default" group
enumStr = GLenumToString(GLenumGroup::DefaultGroup, value);
if (enumStr != kUnknownGLenumString)
{
out << enumStr;
return;
}
}
out << std::hex << "0x" << std::setfill('0') << std::setw(4) << value << std::dec;
}
void OutputGLbitfieldString(std::ostream &out, GLenumGroup enumGroup, unsigned int value)
{
out << GLbitfieldToString(enumGroup, value);
}
const char *GLbooleanToString(unsigned int value)
{
return GLenumToString(GLenumGroup::Boolean, value);
}
std::string GLbitfieldToString(GLenumGroup enumGroup, unsigned int value)
{
std::stringstream st;
if (value == 0)
{
return "0";
}
const angle::BitSet<32> bitSet(value);
bool first = true;
for (const auto index : bitSet)
{
if (!first)
{
st << " | ";
}
first = false;
unsigned int mask = 1u << index;
OutputGLenumString(st, enumGroup, mask);
}
return st.str();
}
} // namespace gl