On 01/14/2014 07:53 PM, Paul Berry wrote:
On 2 January 2014 03:58, Tapani Pälli <tapani.pa...@intel.com
<mailto:tapani.pa...@intel.com>> wrote:
diff --git a/src/glsl/shader_cache.cpp b/src/glsl/shader_cache.cpp
new file mode 100644
+/**
+ * It is currently unknown if we need these to be available.
+ * There can be calls in mesa/main (like glGetAttachedShaders)
that use
+ * the Shaders list.
+ */
+const bool STORE_UNLINKED_SHADERS = false;
I think it really exaggerates our level of uncertainty to say that it
is "currently unknown" whether we need unlinked shaders to be
available. Speaking for myself at least, I'm quite convinced that we
don't. AFAICT,
8<
Thanks for the explanation. I've been holding this until now as I was
not sure if these can be left out but now I cam convinced. I will cut
them out.
So if the user creates a program and calls glProgramBinaryOES()
followed by glGetAttachedShaders(), they will see no shaders, since
the pre-link state is still in its initial configuration of having no
shaders attached.
IMHO, trying to plan for the contingency case where we're wrong about
this is just going to lead to confusion and make the code hard to
maintain. I think we should drop this const, and remove the code that
would have been executed if STORE_UNLINKED_SHADERS were true. In the
unlikely event that it turns out we were wrong about this (or Khronos
I'll do this, I was basically worried if all the errors cases will be
handled properly as there will be a lot of uninitialized pointers and
such out there. But these can be found out and the correct thing to do
is to make sure everything's checked in the shaderapi correctly.
+ blob.write(&shader->Geom, sizeof(shader->Geom));
It seems a little strange to see geometry-shader-specific information
being dumped into the binary, since OES_get_program_binary is a GLES
extension, and GLES doesn't support geometry shaders. I assume you
are doing this because you also want this code to work for
ARB_get_program_binary? If so it would be nice to have a comment
explaining that.
I will add it, the plan is to get both desktop GL and the OES extension
supported.
+static void
+serialize_uniform_storage(gl_uniform_storage *uni, memory_writer
&blob)
I don't think this is right. The ARB_get_program_binary spec says:
8. How does ProgramBinary interact with uniform values, including
shader-specified defaults?
RESOLVED: All uniforms specified in the binary are reset to their
shader-
specified defaults, or to zero if they aren't specified, when the
program
binary is loaded. The spec language has been updated to specify this
behavior.
The OES_get_program_binary spec doesn't mention uniforms at all, but I
believe this is not intended to indicate a behavioural
difference--it's just a consequence of the fact that
ARB_get_program_binary was written later, so they had a chance to
clarify things. In fact, issue #7 in ARB_get_program_binary
specifically says:
7. How does this spec differ from the OES_get_program_binary and why?
...
There are other areas where language was clarified, but this is
meant to
be consistent with the intent of the original specification and not to
alter previously established behavior.
So I believe we shouldn't be serializing uniform values.
For me this seemed much easier way to serialize than recreate it though.
Would it be enough if I reset the default values in place?
+
+
+static void
+read_hash_table(struct string_to_uint_map *hash, memory_map *map)
+{
+ uint32_t size = map->read_uint32_t();
+
+ for (unsigned i = 0; i < size; i++) {
Security issue: we need to bail out of this loop if we try to read
beyond the end of the binary. Otherwise a bogus size could cause us
to read from garbage memory for a very long time.
ok, will fix
+ read_hash_table(prog->UniformHash, &map);
+
+ map.read(&prog->Geom, sizeof(prog->Geom));
+ map.read(&prog->Vert, sizeof(prog->Vert));
+
+ /* just zero for now */
+ prog->LinkedTransformFeedback.Outputs = NULL;
+ prog->LinkedTransformFeedback.Varyings = NULL;
+ prog->LinkedTransformFeedback.NumVarying = 0;
+ prog->LinkedTransformFeedback.NumOutputs = 0;
Did you forget to finish writing this code? We need to serialize this
stuff, since it's part of post-link state.
This part is work in progress, I need to get myself more familiar how
transform feedback API works and what is required.
+#else
+ prog->Shaders = NULL;
+ prog->NumShaders = 0;
This is not correct. Shader objects are part of pre-link state. That
means that glProgramBinaryOES() should ignore them and leave them
unchanged. It shouldn't throw out any attached shaders.
You are right, this is done here only because these are not initialized
properly and when deleting resources we would fail. Correct way is to
intialize these when constructing the program structure.
Incidentally, it occurs to me that maybe we should do a refactor at
the start of this series that splits gl_shader_program into two parts:
struct gl_shader_program {
struct {
...
} PreLink;
struct {
...
} PostLink;
};
That way future maintainers won't have to rely on deep understanding
of the GL spec to keep track of which program state is pre-link and
which is post-link. They can just look in mtypes.h.
This is fine for me. I will make patches for it, I guess this could be
done separately before rest of the set.
// Tapani
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev