mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 01:17:34 +00:00
LibGL: Implement glGetDoublev
This commit is contained in:
parent
6d4a5a40a0
commit
40724a426f
5 changed files with 61 additions and 40 deletions
|
@ -407,8 +407,9 @@ GLAPI void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
|
||||||
GLAPI void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
|
GLAPI void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
|
||||||
GLAPI void glBindTexture(GLenum target, GLuint texture);
|
GLAPI void glBindTexture(GLenum target, GLuint texture);
|
||||||
GLAPI void glActiveTexture(GLenum texture);
|
GLAPI void glActiveTexture(GLenum texture);
|
||||||
GLAPI void glGetFloatv(GLenum pname, GLfloat* params);
|
|
||||||
GLAPI void glGetBooleanv(GLenum pname, GLboolean* data);
|
GLAPI void glGetBooleanv(GLenum pname, GLboolean* data);
|
||||||
|
GLAPI void glGetDoublev(GLenum pname, GLdouble* params);
|
||||||
|
GLAPI void glGetFloatv(GLenum pname, GLfloat* params);
|
||||||
GLAPI void glGetIntegerv(GLenum pname, GLint* data);
|
GLAPI void glGetIntegerv(GLenum pname, GLint* data);
|
||||||
GLAPI void glDepthMask(GLboolean flag);
|
GLAPI void glDepthMask(GLboolean flag);
|
||||||
GLAPI void glEnableClientState(GLenum cap);
|
GLAPI void glEnableClientState(GLenum cap);
|
||||||
|
|
|
@ -66,7 +66,6 @@ public:
|
||||||
virtual void gl_tex_env(GLenum target, GLenum pname, GLfloat param) = 0;
|
virtual void gl_tex_env(GLenum target, GLenum pname, GLfloat param) = 0;
|
||||||
virtual void gl_bind_texture(GLenum target, GLuint texture) = 0;
|
virtual void gl_bind_texture(GLenum target, GLuint texture) = 0;
|
||||||
virtual void gl_active_texture(GLenum texture) = 0;
|
virtual void gl_active_texture(GLenum texture) = 0;
|
||||||
virtual void gl_get_floatv(GLenum pname, GLfloat* params) = 0;
|
|
||||||
virtual void gl_depth_mask(GLboolean flag) = 0;
|
virtual void gl_depth_mask(GLboolean flag) = 0;
|
||||||
virtual void gl_enable_client_state(GLenum cap) = 0;
|
virtual void gl_enable_client_state(GLenum cap) = 0;
|
||||||
virtual void gl_disable_client_state(GLenum cap) = 0;
|
virtual void gl_disable_client_state(GLenum cap) = 0;
|
||||||
|
@ -77,6 +76,8 @@ public:
|
||||||
virtual void gl_draw_elements(GLenum mode, GLsizei count, GLenum type, const void* indices) = 0;
|
virtual void gl_draw_elements(GLenum mode, GLsizei count, GLenum type, const void* indices) = 0;
|
||||||
virtual void gl_color_mask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) = 0;
|
virtual void gl_color_mask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) = 0;
|
||||||
virtual void gl_get_booleanv(GLenum pname, GLboolean* data) = 0;
|
virtual void gl_get_booleanv(GLenum pname, GLboolean* data) = 0;
|
||||||
|
virtual void gl_get_doublev(GLenum pname, GLdouble* params) = 0;
|
||||||
|
virtual void gl_get_floatv(GLenum pname, GLfloat* params) = 0;
|
||||||
virtual void gl_get_integerv(GLenum pname, GLint* data) = 0;
|
virtual void gl_get_integerv(GLenum pname, GLint* data) = 0;
|
||||||
virtual void gl_depth_range(GLdouble min, GLdouble max) = 0;
|
virtual void gl_depth_range(GLdouble min, GLdouble max) = 0;
|
||||||
virtual void gl_depth_func(GLenum func) = 0;
|
virtual void gl_depth_func(GLenum func) = 0;
|
||||||
|
|
|
@ -100,16 +100,21 @@ void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format
|
||||||
g_gl_context->gl_read_pixels(x, y, width, height, format, type, pixels);
|
g_gl_context->gl_read_pixels(x, y, width, height, format, type, pixels);
|
||||||
}
|
}
|
||||||
|
|
||||||
void glGetFloatv(GLenum pname, GLfloat* params)
|
|
||||||
{
|
|
||||||
g_gl_context->gl_get_floatv(pname, params);
|
|
||||||
}
|
|
||||||
|
|
||||||
void glGetBooleanv(GLenum pname, GLboolean* data)
|
void glGetBooleanv(GLenum pname, GLboolean* data)
|
||||||
{
|
{
|
||||||
g_gl_context->gl_get_booleanv(pname, data);
|
g_gl_context->gl_get_booleanv(pname, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void glGetDoublev(GLenum pname, GLdouble* params)
|
||||||
|
{
|
||||||
|
g_gl_context->gl_get_doublev(pname, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
void glGetFloatv(GLenum pname, GLfloat* params)
|
||||||
|
{
|
||||||
|
g_gl_context->gl_get_floatv(pname, params);
|
||||||
|
}
|
||||||
|
|
||||||
void glGetIntegerv(GLenum pname, GLint* data)
|
void glGetIntegerv(GLenum pname, GLint* data)
|
||||||
{
|
{
|
||||||
g_gl_context->gl_get_integerv(pname, data);
|
g_gl_context->gl_get_integerv(pname, data);
|
||||||
|
|
|
@ -1442,38 +1442,6 @@ void SoftwareGLContext::gl_active_texture(GLenum texture)
|
||||||
m_active_texture_unit = &m_texture_units.at(texture - GL_TEXTURE0);
|
m_active_texture_unit = &m_texture_units.at(texture - GL_TEXTURE0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoftwareGLContext::gl_get_floatv(GLenum pname, GLfloat* params)
|
|
||||||
{
|
|
||||||
RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
|
|
||||||
|
|
||||||
auto flatten_and_assign_matrix = [¶ms](const FloatMatrix4x4& matrix) {
|
|
||||||
auto elements = matrix.elements();
|
|
||||||
|
|
||||||
for (size_t i = 0; i < 4; ++i) {
|
|
||||||
for (size_t j = 0; j < 4; ++j) {
|
|
||||||
params[i * 4 + j] = elements[i][j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
switch (pname) {
|
|
||||||
case GL_MODELVIEW_MATRIX:
|
|
||||||
if (m_current_matrix_mode == GL_MODELVIEW)
|
|
||||||
flatten_and_assign_matrix(m_model_view_matrix);
|
|
||||||
else {
|
|
||||||
if (m_model_view_matrix_stack.is_empty())
|
|
||||||
flatten_and_assign_matrix(FloatMatrix4x4::identity());
|
|
||||||
else
|
|
||||||
flatten_and_assign_matrix(m_model_view_matrix_stack.last());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// FIXME: Because glQuake only requires GL_MODELVIEW_MATRIX, that is the only parameter
|
|
||||||
// that we currently support. More parameters should be supported.
|
|
||||||
RETURN_WITH_ERROR_IF(true, GL_INVALID_ENUM);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SoftwareGLContext::gl_get_booleanv(GLenum pname, GLboolean* data)
|
void SoftwareGLContext::gl_get_booleanv(GLenum pname, GLboolean* data)
|
||||||
{
|
{
|
||||||
RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
|
RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
|
||||||
|
@ -1510,6 +1478,48 @@ void SoftwareGLContext::gl_get_booleanv(GLenum pname, GLboolean* data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SoftwareGLContext::gl_get_doublev(GLenum pname, GLdouble* params)
|
||||||
|
{
|
||||||
|
get_floating_point(pname, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SoftwareGLContext::gl_get_floatv(GLenum pname, GLfloat* params)
|
||||||
|
{
|
||||||
|
get_floating_point(pname, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void SoftwareGLContext::get_floating_point(GLenum pname, T* params)
|
||||||
|
{
|
||||||
|
RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
|
||||||
|
|
||||||
|
auto flatten_and_assign_matrix = [¶ms](const FloatMatrix4x4& matrix) {
|
||||||
|
auto elements = matrix.elements();
|
||||||
|
|
||||||
|
for (size_t i = 0; i < 4; ++i) {
|
||||||
|
for (size_t j = 0; j < 4; ++j) {
|
||||||
|
params[i * 4 + j] = static_cast<T>(elements[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
switch (pname) {
|
||||||
|
case GL_MODELVIEW_MATRIX:
|
||||||
|
if (m_current_matrix_mode == GL_MODELVIEW)
|
||||||
|
flatten_and_assign_matrix(m_model_view_matrix);
|
||||||
|
else {
|
||||||
|
if (m_model_view_matrix_stack.is_empty())
|
||||||
|
flatten_and_assign_matrix(FloatMatrix4x4::identity());
|
||||||
|
else
|
||||||
|
flatten_and_assign_matrix(m_model_view_matrix_stack.last());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dbgln_if(GL_DEBUG, "FIXME: unimplemented floating point parameter {:#x}", pname);
|
||||||
|
RETURN_WITH_ERROR_IF(true, GL_INVALID_ENUM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SoftwareGLContext::gl_get_integerv(GLenum pname, GLint* data)
|
void SoftwareGLContext::gl_get_integerv(GLenum pname, GLint* data)
|
||||||
{
|
{
|
||||||
RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
|
RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION);
|
||||||
|
|
|
@ -77,7 +77,6 @@ public:
|
||||||
virtual void gl_tex_env(GLenum target, GLenum pname, GLfloat param) override;
|
virtual void gl_tex_env(GLenum target, GLenum pname, GLfloat param) override;
|
||||||
virtual void gl_bind_texture(GLenum target, GLuint texture) override;
|
virtual void gl_bind_texture(GLenum target, GLuint texture) override;
|
||||||
virtual void gl_active_texture(GLenum texture) override;
|
virtual void gl_active_texture(GLenum texture) override;
|
||||||
virtual void gl_get_floatv(GLenum pname, GLfloat* params) override;
|
|
||||||
virtual void gl_depth_mask(GLboolean flag) override;
|
virtual void gl_depth_mask(GLboolean flag) override;
|
||||||
virtual void gl_enable_client_state(GLenum cap) override;
|
virtual void gl_enable_client_state(GLenum cap) override;
|
||||||
virtual void gl_disable_client_state(GLenum cap) override;
|
virtual void gl_disable_client_state(GLenum cap) override;
|
||||||
|
@ -88,6 +87,8 @@ public:
|
||||||
virtual void gl_draw_elements(GLenum mode, GLsizei count, GLenum type, const void* indices) override;
|
virtual void gl_draw_elements(GLenum mode, GLsizei count, GLenum type, const void* indices) override;
|
||||||
virtual void gl_color_mask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) override;
|
virtual void gl_color_mask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) override;
|
||||||
virtual void gl_get_booleanv(GLenum pname, GLboolean* data) override;
|
virtual void gl_get_booleanv(GLenum pname, GLboolean* data) override;
|
||||||
|
virtual void gl_get_doublev(GLenum pname, GLdouble* params) override;
|
||||||
|
virtual void gl_get_floatv(GLenum pname, GLfloat* params) override;
|
||||||
virtual void gl_get_integerv(GLenum pname, GLint* data) override;
|
virtual void gl_get_integerv(GLenum pname, GLint* data) override;
|
||||||
virtual void gl_depth_range(GLdouble min, GLdouble max) override;
|
virtual void gl_depth_range(GLdouble min, GLdouble max) override;
|
||||||
virtual void gl_depth_func(GLenum func) override;
|
virtual void gl_depth_func(GLenum func) override;
|
||||||
|
@ -117,6 +118,9 @@ private:
|
||||||
m_current_listing_index->listing.entries.empend(member, Listing::ArgumentsFor<member> { forward<Args>(args)... });
|
m_current_listing_index->listing.entries.empend(member, Listing::ArgumentsFor<member> { forward<Args>(args)... });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void get_floating_point(GLenum pname, T* params);
|
||||||
|
|
||||||
[[nodiscard]] bool should_append_to_listing() const { return m_current_listing_index.has_value(); }
|
[[nodiscard]] bool should_append_to_listing() const { return m_current_listing_index.has_value(); }
|
||||||
[[nodiscard]] bool should_execute_after_appending_to_listing() const { return m_current_listing_index.has_value() && m_current_listing_index->mode == GL_COMPILE_AND_EXECUTE; }
|
[[nodiscard]] bool should_execute_after_appending_to_listing() const { return m_current_listing_index.has_value() && m_current_listing_index->mode == GL_COMPILE_AND_EXECUTE; }
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue