Add F_r32i texture format (useful for atomic image writes from shaders)

This commit is contained in:
rdb 2014-07-03 17:39:53 +00:00
parent 7a610cc198
commit 0e1f261ca5
3 changed files with 42 additions and 0 deletions

View File

@ -4774,6 +4774,9 @@ framebuffer_copy_to_ram(Texture *tex, int view, int z,
case GL_FLOAT:
GLCAT.spam(false) << "GL_FLOAT";
break;
case GL_INT:
GLCAT.spam(false) << "GL_INT";
break;
default:
GLCAT.spam(false) << "unknown";
break;
@ -6545,6 +6548,8 @@ get_component_type(Texture::ComponentType component_type) {
} else {
return GL_UNSIGNED_BYTE;
}
case Texture::T_int:
return GL_INT;
default:
GLCAT.error() << "Invalid Texture::Type value!\n";
return GL_UNSIGNED_BYTE;
@ -6756,6 +6761,8 @@ get_external_image_format(Texture *tex) const {
case Texture::F_luminance_alpha:
case Texture::F_sluminance_alpha:
return GL_LUMINANCE_ALPHA;
case Texture::F_r32i:
return GL_RED_INTEGER;
}
GLCAT.error()
<< "Invalid Texture::Format value in get_external_image_format(): "
@ -7153,6 +7160,9 @@ get_internal_image_format(Texture *tex) const {
case Texture::F_sluminance_alpha:
return GL_SLUMINANCE8_ALPHA8;
case Texture::F_r32i:
return GL_R32I;
default:
GLCAT.error()
<< "Invalid image format in get_internal_image_format(): "
@ -10306,6 +10316,10 @@ do_extract_texture_data(CLP(TextureContext) *gtc) {
format = Texture::F_red;
break;
#endif
case GL_R32I:
format = Texture::F_r32i;
break;
#ifndef OPENGLES
case GL_RED:
format = Texture::F_red;

View File

@ -581,6 +581,10 @@ estimate_texture_memory() const {
bpp = 6;
break;
case Texture::F_r32i:
bpp = 4;
break;
default:
break;
}
@ -1597,6 +1601,10 @@ write(ostream &out, int indent_level) const {
out << " floats";
break;
case T_int:
out << " ints";
break;
default:
break;
}
@ -1707,6 +1715,10 @@ write(ostream &out, int indent_level) const {
case F_sluminance_alpha:
out << "sluminance_alpha";
break;
case F_r32i:
out << "r32i";
break;
}
if (cdata->_compression != CM_default) {
@ -2034,6 +2046,8 @@ format_component_type(ComponentType ct) {
return "float";
case T_unsigned_int_24_8:
return "unsigned_int_24_8";
case T_int:
return "int";
}
return "**invalid**";
@ -2055,6 +2069,8 @@ string_component_type(const string &str) {
return T_float;
} else if (cmp_nocase(str, "unsigned_int_24_8") == 0) {
return T_unsigned_int_24_8;
} else if (cmp_nocase(str, "int") == 0) {
return T_int;
}
gobj_cat->error()
@ -2137,6 +2153,8 @@ format_format(Format format) {
return "sluminance";
case F_sluminance_alpha:
return "sluminance_alpha";
case F_r32i:
return "r32i";
}
return "**invalid**";
}
@ -2215,6 +2233,8 @@ string_format(const string &str) {
return F_sluminance;
} else if (cmp_nocase(str, "sluminance_alpha") == 0) {
return F_sluminance_alpha;
} else if (cmp_nocase(str, "r32i") == 0) {
return F_r32i;
}
gobj_cat->error()
@ -5060,6 +5080,7 @@ do_set_format(CData *cdata, Texture::Format format) {
case F_luminance:
case F_r16:
case F_sluminance:
case F_r32i:
cdata->_num_components = 1;
break;
@ -5119,6 +5140,10 @@ do_set_component_type(CData *cdata, Texture::ComponentType component_type) {
case T_unsigned_int_24_8:
cdata->_component_width = 4;
break;
case T_int:
cdata->_component_width = 4;
break;
}
}

View File

@ -86,6 +86,7 @@ PUBLISHED:
T_unsigned_short,
T_float,
T_unsigned_int_24_8,
T_int,
};
enum Format {
@ -139,6 +140,8 @@ PUBLISHED:
F_srgb_alpha,
F_sluminance,
F_sluminance_alpha,
F_r32i, // 32-bit integer, used for atomic access
};
enum FilterType {