mirror of https://github.com/PCSX2/pcsx2.git
gsdx-ogl: LINUX-ONLY
* invert the index of fragment output. Seem to work better on Nvidia (strangely no impact for AMD) * opengl support pitch too, so remove useless copy to an fbo git-svn-id: http://pcsx2.googlecode.com/svn/branches/gsdx-ogl@5034 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
ea33beb360
commit
9ca65c9cc6
|
@ -18,6 +18,7 @@ set(CommonFlags
|
|||
-Wunused-variable
|
||||
-std=c++0x
|
||||
-fno-strict-aliasing
|
||||
-DOGL_DEBUG
|
||||
)
|
||||
|
||||
set(OptimizationFlags
|
||||
|
@ -28,7 +29,7 @@ set(OptimizationFlags
|
|||
# Debug - Build
|
||||
if(CMAKE_BUILD_TYPE STREQUAL Debug)
|
||||
# add defines
|
||||
add_definitions(${CommonFlags} -g -Wall)
|
||||
add_definitions(${CommonFlags} -DOGL_DEBUG -g -Wall)
|
||||
endif(CMAKE_BUILD_TYPE STREQUAL Debug)
|
||||
|
||||
# Devel - Build
|
||||
|
|
|
@ -54,8 +54,8 @@
|
|||
|
||||
//#define LOUD_DEBUGGING
|
||||
#define SHADER_DEBUG
|
||||
//#define DUMP_START (500)
|
||||
//#define DUMP_LENGTH (40)
|
||||
//#define DUMP_START (13000)
|
||||
//#define DUMP_LENGTH (200)
|
||||
//#define DUMP_ONLY_FRAME (112)
|
||||
|
||||
#ifdef DUMP_START
|
||||
|
@ -219,9 +219,9 @@ bool GSDeviceOGL::Create(GSWnd* wnd)
|
|||
|
||||
glGenFramebuffers(1, &m_fbo);
|
||||
// Setup FBO fragment output
|
||||
OMSetFBO(m_fbo);
|
||||
glDrawBuffer(GL_COLOR_ATTACHMENT0);
|
||||
OMSetFBO(0);
|
||||
// OMSetFBO(m_fbo);
|
||||
// glDrawBuffer(GL_COLOR_ATTACHMENT0);
|
||||
// OMSetFBO(0);
|
||||
|
||||
// ****************************************************************
|
||||
// Vertex buffer state
|
||||
|
@ -706,12 +706,11 @@ void GSDeviceOGL::CopyRect(GSTexture* st, GSTexture* dt, const GSVector4i& r)
|
|||
// GL_NV_copy_image seem like the good extension but not supported on AMD...
|
||||
// Maybe opengl 4.3 !
|
||||
// FIXME check those function work as expected
|
||||
|
||||
|
||||
// FIXME FBO
|
||||
GLuint fbo_old = m_state.fbo;
|
||||
OMSetFBO(m_fbo);
|
||||
|
||||
|
||||
// Set the input of glCopyTexSubImage2D
|
||||
static_cast<GSTextureOGL*>(st)->Attach(GL_COLOR_ATTACHMENT1);
|
||||
glReadBuffer(GL_COLOR_ATTACHMENT1);
|
||||
|
@ -1012,6 +1011,8 @@ void GSDeviceOGL::IASetVertexBuffer(const void* vertices, size_t count)
|
|||
}
|
||||
|
||||
vb->upload(vertices, map_flags);
|
||||
// FIXME: disable it when code is working
|
||||
CheckDebugLog();
|
||||
}
|
||||
|
||||
void GSDeviceOGL::IASetPrimitiveTopology(GLenum topology)
|
||||
|
|
|
@ -171,6 +171,12 @@ struct GSVertexBufferState {
|
|||
void upload(const void* src, uint32 flags)
|
||||
{
|
||||
uint8* dst = (uint8*) glMapBufferRange(GL_ARRAY_BUFFER, stride*start, stride*count, flags);
|
||||
#ifdef OGL_DEBUG
|
||||
if (dst == NULL) {
|
||||
fprintf(stderr, "CRITICAL ERROR map failed for vb !!!\n");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
memcpy(dst, src, stride*count);
|
||||
glUnmapBuffer(GL_ARRAY_BUFFER);
|
||||
}
|
||||
|
|
|
@ -26,8 +26,7 @@ static uint g_state_texture_unit = 0;
|
|||
static uint g_state_texture_id = 0;
|
||||
|
||||
GSTextureOGL::GSTextureOGL(int type, int w, int h, bool msaa, int format)
|
||||
: m_texture_unit(0),
|
||||
m_extra_buffer_id(0),
|
||||
: m_extra_buffer_id(0),
|
||||
m_pbo_size(0)
|
||||
{
|
||||
// *************************************************************
|
||||
|
@ -120,7 +119,7 @@ GSTextureOGL::GSTextureOGL(int type, int w, int h, bool msaa, int format)
|
|||
switch (m_type) {
|
||||
case GSTexture::DepthStencil:
|
||||
EnableUnit(1);
|
||||
glTexImage2D(m_texture_target, 0, m_format, w, h, 0, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, NULL);
|
||||
glTexImage2D(m_texture_target, 0, m_format, m_size.x, m_size.y, 0, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, NULL);
|
||||
break;
|
||||
case GSTexture::RenderTarget:
|
||||
case GSTexture::Texture:
|
||||
|
@ -130,7 +129,7 @@ GSTextureOGL::GSTextureOGL(int type, int w, int h, bool msaa, int format)
|
|||
// For the moment SW renderer only use 1 so don't bother
|
||||
EnableUnit(0);
|
||||
if (m_format == GL_RGBA8) {
|
||||
glTexImage2D(m_texture_target, 0, m_format, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||
glTexImage2D(m_texture_target, 0, m_format, m_size.x, m_size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||
}
|
||||
else
|
||||
assert(0); // TODO Later
|
||||
|
@ -161,54 +160,27 @@ void GSTextureOGL::Attach(GLenum attachment)
|
|||
|
||||
bool GSTextureOGL::Update(const GSVector4i& r, const void* data, int pitch)
|
||||
{
|
||||
// static int update_count = 0;
|
||||
// update_count++;
|
||||
// To update only a part of the texture you can use:
|
||||
// glTexSubImage2D — specify a two-dimensional texture subimage
|
||||
if (m_type == GSTexture::DepthStencil || m_type == GSTexture::Offscreen) assert(0);
|
||||
|
||||
// glTexSubImage2D specifies a two-dimensional subtexture for the current texture unit, specified with glActiveTexture.
|
||||
// If a non-zero named buffer object is bound to the GL_PIXEL_UNPACK_BUFFER target
|
||||
//(see glBindBuffer) while a texture image is
|
||||
// specified, data is treated as a byte offset into the buffer object's data store
|
||||
// FIXME warning order of the y axis
|
||||
// FIXME I'm not confident with GL_UNSIGNED_BYTE type
|
||||
// FIXME add a state check
|
||||
|
||||
EnableUnit(0);
|
||||
|
||||
if (m_format != GL_RGBA8) assert(0);
|
||||
|
||||
// FIXME. That suck but I don't know how to do better for now. I think we need to create a texture buffer and directly upload the copy
|
||||
// The case appears on SW mode. Src pitch is 2x dst pitch.
|
||||
int rowbytes = r.width() << 2;
|
||||
if (pitch != rowbytes) {
|
||||
uint32 map_flags = GL_MAP_WRITE_BIT;
|
||||
|
||||
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_extra_buffer_id);
|
||||
if (!m_pbo_size) {
|
||||
m_pbo_size = m_size.x * m_size.y * 4;
|
||||
glBufferData(GL_PIXEL_UNPACK_BUFFER, m_pbo_size, NULL, GL_STREAM_DRAW);
|
||||
} else {
|
||||
GL_MAP_INVALIDATE_BUFFER_BIT;
|
||||
}
|
||||
|
||||
uint8* src = (uint8*) data;
|
||||
uint8* dst = (uint8*) glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, m_pbo_size, map_flags);
|
||||
for(int h = r.height(); h > 0; h--, src += pitch, dst += rowbytes)
|
||||
{
|
||||
memcpy(dst, src, rowbytes);
|
||||
}
|
||||
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
|
||||
|
||||
glTexSubImage2D(m_texture_target, 0, r.x, r.y, r.width(), r.height(), GL_RGBA, GL_UNSIGNED_BYTE, 0 /* offset in UNPACK BUFFER */);
|
||||
|
||||
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
||||
|
||||
} else {
|
||||
glTexSubImage2D(m_texture_target, 0, r.x, r.y, r.width(), r.height(), GL_RGBA, GL_UNSIGNED_BYTE, data);
|
||||
if (m_format != GL_RGBA8) {
|
||||
fprintf(stderr, "wrong pixel format\n");
|
||||
assert(0);
|
||||
}
|
||||
|
||||
// pitch could be different of width*element_size
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch>>2);
|
||||
// FIXME : it crash on colin mcrae rally 3 (others game too) when the size is 16
|
||||
//if (m_size.x != 16)
|
||||
glTexSubImage2D(m_texture_target, 0, r.x, r.y, r.width(), r.height(), GL_RGBA, GL_UNSIGNED_BYTE, data);
|
||||
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); // Restore default behavior
|
||||
|
||||
return true;
|
||||
#if 0
|
||||
if(m_dev && m_texture)
|
||||
{
|
||||
|
|
|
@ -28,7 +28,6 @@ class GSTextureOGL : public GSTexture
|
|||
private:
|
||||
GLenum m_texture_target; // texture target: 2D, rectangle etc...
|
||||
GLuint m_texture_id; // the texture id
|
||||
uint m_texture_unit; // the texture unit offset
|
||||
uint m_extra_buffer_id;
|
||||
int m_pbo_size;
|
||||
|
||||
|
|
|
@ -257,8 +257,8 @@ void gs_main()
|
|||
layout(location = 0) in vertex PSin;
|
||||
|
||||
// Same buffer but 2 colors for dual source blending
|
||||
layout(location = 0, index = 0) out vec4 SV_Target0;
|
||||
layout(location = 0, index = 1) out vec4 SV_Target1;
|
||||
layout(location = 0, index = 1) out vec4 SV_Target0;
|
||||
layout(location = 0, index = 0) out vec4 SV_Target1;
|
||||
|
||||
layout(binding = 0) uniform sampler2D TextureSampler;
|
||||
layout(binding = 1) uniform sampler2D PaletteSampler;
|
||||
|
|
Loading…
Reference in New Issue